﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПодтверждениеЗакрытияФормы;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Сценарий = "ПоискСсылок" ИЛИ Параметры.Сценарий = "ВставкаИзБуфераОбмена" Тогда
		ТипЗагрузки = "ВставкаИзБуфераОбмена";
	ИначеЕсли ЗначениеЗаполнено(Параметры.ПолноеИмяТабличнойЧасти) Тогда
		ТипЗагрузки = "ТабличнаяЧасть";
	ИначеЕсли НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
		ВызватьИсключение(НСтр("ru = 'Недостаточно прав для открытия загрузки данных из файла'"));
	КонецЕсли;
	
	СоздаватьЕслиНеСопоставлено = 1;
	ОбновлятьСуществующие = 0;
	ДополнительныеПараметры = Параметры.ДополнительныеПараметры;
	
	УстановитьОформлениеДанных();
	УстановитьВидимостьЭлементовФормы();
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		ИнициализацияВставкиИзБуфераОбмена();
	ИначеЕсли ТипЗагрузки = "ТабличнаяЧасть" Тогда
		ИмяОбъектаСопоставления = Обработки.ЗагрузкаДанныхИзФайла.ПолноеИмяОбъектаТабличнаяЧасть(Параметры.ПолноеИмяТабличнойЧасти);
		
		ТаблицаИнформацияПоКолонкам = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЗагрузкаДанныхИзФайла", ИмяОбъектаСопоставления,, ИмяПользователя()); // ТаблицаЗначений
		Если ТаблицаИнформацияПоКолонкам = Неопределено Тогда
			ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
		Иначе
			Если ТаблицаИнформацияПоКолонкам.Колонки.Найти("Родитель") = Неопределено Тогда
				ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
			КонецЕсли;
		КонецЕсли;
		
		ПараметрыЗагрузкиДанных = ПараметрыЗагрузки();
		ПараметрыЗагрузкиДанных.ТипЗагрузки = ТипЗагрузки;
		ПараметрыЗагрузкиДанных.ПолноеИмяОбъекта = ИмяОбъектаСопоставления;
		ПараметрыЗагрузкиДанных.Макет = ?(ЗначениеЗаполнено(Параметры.ИмяМакетаСШаблоном), Параметры.ИмяМакетаСШаблоном, "ЗагрузкаИзФайла");
		ПараметрыЗагрузкиДанных.ДополнительныеПараметры = ДополнительныеПараметры;
		
		Если Параметры.Свойство("КолонкиМакета") И Параметры.КолонкиМакета <> Неопределено Тогда
			ОпределитьДинамическийМакет(ТаблицаИнформацияПоКолонкам, Параметры.КолонкиМакета);
			Элементы.ИзменитьБланк.Видимость = Ложь;
			Элементы.ИзменитьБланкЗаполнениеТаблицы.Видимость = Ложь;
			ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ЗагрузкаВТабличнуюЧасть.ДинамическийМакет",, Параметры.ПолноеИмяТабличнойЧасти);
		Иначе
			Обработки.ЗагрузкаДанныхИзФайла.ОпределитьИнформацияПоКолонкам(ПараметрыЗагрузкиДанных, ТаблицаИнформацияПоКолонкам);
			ИзменитьБланкПоИнформацииПоКолонкам();
			ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ЗагрузкаВТабличнуюЧасть.СтатическийМакет",, Параметры.ПолноеИмяТабличнойЧасти);
			Если Отказ Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
		ЗначениеВРеквизитФормы(ТаблицаИнформацияПоКолонкам, "ИнформацияПоКолонкам");
		
		ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки();
		ИзменитьБланкПоИнформацииПоКолонкам();
		
	Иначе
		ЗаполнитьСписокВидЗагрузкиДанных();
	КонецЕсли;
	
КонецПроцедуры

// Возвращаемое значение:
//  Структура:
//   * ТипЗагрузки - Строка
//   * ПолноеИмяОбъекта - Строка
//   * Макет - Строка
//   * ДополнительныеПараметры - Структура
//
&НаСервере
Функция ПараметрыЗагрузки() 
	
	ПараметрыЗагрузки = Новый Структура;
	ПараметрыЗагрузки.Вставить("ТипЗагрузки", "");
	ПараметрыЗагрузки.Вставить("ПолноеИмяОбъекта", "");
	ПараметрыЗагрузки.Вставить("Макет", "ЗагрузкаИзФайла");
	ПараметрыЗагрузки.Вставить("ДополнительныеПараметры", Новый Структура);
	
	Возврат ПараметрыЗагрузки;
	
КонецФункции

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ПодтверждениеЗакрытияФормы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Отказ = Отказ Или (ПодтверждениеЗакрытияФормы <> Истина);
	Если ЗавершениеРаботы Тогда
		ТекстПредупреждения = НСтр("ru = 'Введенные данные не будут записаны.'");
		Возврат;
	КонецЕсли;
		
	Если Отказ Тогда
		Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
		ТекстВопроса = НСтр("ru = 'Введенные данные не будут записаны. Закрыть форму?'");
		ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	Иначе
		Если ОткрытьСправочникПослеЗакрытияПомощника Тогда 
			ОткрытьФорму(ФормаСписка(ИмяОбъектаСопоставления));
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ФильтрОтчетПриИзменении(Элемент)

	ФоновоеЗаданиеОтчетНаКлиенте(Ложь);
	
	Если ФильтрОтчет = "Пропущенные" Тогда
		Элементы.ИзменитьРеквизиты.Доступность=Ложь;
	Иначе
		Элементы.ИзменитьРеквизиты.Доступность=Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ФильтрТаблицаСопоставленияПриИзменении(Элемент)
	УстановитьФильтрациюТаблицыСопоставления();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФильтрациюТаблицыСопоставления()
	
	Фильтр = ФильтрТаблицаСопоставления;
	
	Если Фильтр = "Сопоставленные" Тогда
		Элементы.ТаблицаСопоставленияДанных.ОтборСтрок = Новый ФиксированнаяСтруктура("РезультатСопоставленияСтроки", 
			ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен());
	ИначеЕсли Фильтр = "Несопоставленные" Тогда 
		Элементы.ТаблицаСопоставленияДанных.ОтборСтрок = Новый ФиксированнаяСтруктура("РезультатСопоставленияСтроки", 
			ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксНесопоставленныхСтрок());
	ИначеЕсли Фильтр = "Неоднозначные" Тогда 
		Элементы.ТаблицаСопоставленияДанных.ОтборСтрок = Новый ФиксированнаяСтруктура("РезультатСопоставленияСтроки", 
			ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность());
	Иначе
		Элементы.ТаблицаСопоставленияДанных.ОтборСтрок = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокКолонокСопоставленияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если СопоставитьПоКолонке.Количество() = 0 Тогда
		Для каждого СведенияОКолонке Из ИнформацияПоКолонкам Цикл
			Если (ТипЗнч(СведенияОКолонке.ТипКолонки) = Тип("Строка")
				 И СведенияОКолонке.ТипКолонки.КвалификаторыСтроки.Длина = 0)
				 ИЛИ СтрНачинаетсяС(СведенияОКолонке.ИмяКолонки, "Свойство_") Тогда
					Продолжить;
			КонецЕсли;
			ПредставлениеКолонки = ?(ПустаяСтрока(СведенияОКолонке.Синоним), СведенияОКолонке.ПредставлениеКолонки, СведенияОКолонке.Синоним);
			СопоставитьПоКолонке.Добавить(СведенияОКолонке.ИмяКолонки, ПредставлениеКолонки);
		КонецЦикла;
	КонецЕсли;
	
	ПараметрыФормы      = Новый Структура("СписокКолонок", СопоставитьПоКолонке);
	ОписаниеОповещения  = Новый ОписаниеОповещения("ПослеВыбораКолонокДляСопоставления", ЭтотОбъект);
	ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.ВыборКолонок", ПараметрыФормы, ЭтотОбъект, , , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораКолонокДляСопоставления(Результат, Параметр) Экспорт
	
	Если Результат = Неопределено Тогда 
		Возврат;
	КонецЕсли;
		 
	СопоставитьПоКолонке = Результат;
	КолонкиВСтроку = "";
	Разделитель = "";
	КоличествоВыбранныхКолонок = 0;
	Для каждого Элемент Из СопоставитьПоКолонке Цикл 
		Если Элемент.Пометка Тогда 
			КолонкиВСтроку = КолонкиВСтроку + Разделитель + Элемент.Представление;
			Разделитель = ", ";
			КоличествоВыбранныхКолонок = КоличествоВыбранныхКолонок + 1;
		КонецЕсли;
	КонецЦикла;
	
	СписокКолонокСопоставления = КолонкиВСтроку;
	ВыполнитьСопоставление();
КонецПроцедуры

&НаКлиенте
Процедура ВариантЗагрузкиПриИзменении(Элемент)
	
	Если ВариантЗагрузки = 0 Тогда
		Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗаполнениеТаблицы;
	Иначе
		Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗагрузкаИзФайла;
	КонецЕсли;
	
	ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки();
	
КонецПроцедуры

&НаКлиенте
Процедура ВидЗагрузкиДанныхВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПереходКСледующемуШагуЗагрузкиДанных();
КонецПроцедуры

&НаКлиенте
Процедура ВидЗагрузкиДанныхПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаОтчетПриАктивизации(Элемент)
	Если ТаблицаОтчет.ТекущаяОбласть.Низ = 1 И ТаблицаОтчет.ТекущаяОбласть.Верх = 1 Тогда
		Элементы.ИзменитьРеквизиты.Доступность = Ложь;
	Иначе
		Элементы.ИзменитьРеквизиты.Доступность = Истина;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыШаблонСДанными

&НаКлиенте
Процедура ШаблонСДаннымиПриАктивизации(Элемент)
	Элемент.Защита = ?(Элемент.ТекущаяОбласть.Верх > ВысотаШапкиШаблонаСДанными, Ложь, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ШаблонСДаннымиВыбор(Элемент, Область, СтандартнаяОбработка)
	Если Область.Верх <= ВысотаШапкиШаблонаСДанными Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаСопоставленияДанных

&НаКлиенте
Процедура ТаблицаСопоставленияДанныхПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	Если ТипЗагрузки <> "ТабличнаяЧасть" Тогда
		Если ЗначениеЗаполнено(Элемент.ТекущиеДанные.ОбъектСопоставления) Тогда 
			Элемент.ТекущиеДанные.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
		Иначе
			Элемент.ТекущиеДанные.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен();
		КонецЕсли;
	Иначе
		Отбор = Новый Структура("ОбязательнаДляЗаполнения", Истина);
		КолонкиОбязательнаДляЗаполнения = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
		РезультатСопоставленияСтроки    = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
		ПрефиксТабличнойЧасти           = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_";
		
		Для каждого КолонкаТаблицы Из КолонкиОбязательнаДляЗаполнения Цикл
			Если Не ЗначениеЗаполнено(Элемент.ТекущиеДанные[ПрефиксТабличнойЧасти + КолонкаТаблицы.Родитель]) Тогда
				РезультатСопоставленияСтроки = ?(ЗначениеЗаполнено(Элемент.ТекущиеДанные.ОписаниеОшибки), 
					ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность(), ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Элемент.ТекущиеДанные.РезультатСопоставленияСтроки = РезультатСопоставленияСтроки;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла", 0.2, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаСопоставленияДанныхПриАктивизацииЯчейки(Элемент)
	Элементы.УстранитьНеоднозначность.Доступность = Ложь;
	Элементы.ТаблицаСопоставленияДанныхКонтекстноеМенюРазрешитьНеоднозначность.Доступность = Ложь;
	
	Если Элемент.ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(Элемент.ТекущиеДанные.РезультатСопоставленияСтроки) Тогда 
		Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
			ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_"; 
			Если СтрДлина(Элемент.ТекущийЭлемент.Имя) > 3 И СтрНачинаетсяС(Элемент.ТекущийЭлемент.Имя, ПрефиксТабличнойЧасти) Тогда
				ИмяКолонки = Сред(Элемент.ТекущийЭлемент.Имя, 4);
				Если СтрНайти(Элемент.ТекущиеДанные.ОписаниеОшибки, ИмяКолонки) > 0 Тогда 
					Элементы.УстранитьНеоднозначность.Доступность = Истина;
					Элементы.ТаблицаСопоставленияДанныхКонтекстноеМенюРазрешитьНеоднозначность.Доступность = Истина;
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли Элемент.ТекущиеДанные.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность() Тогда 
			Элементы.УстранитьНеоднозначность.Доступность = Истина;
			Элементы.ТаблицаСопоставленияДанныхКонтекстноеМенюРазрешитьНеоднозначность.Доступность = Истина;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаСопоставленияДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ОткрытьФормуРазрешенияНеоднозначности(ВыбраннаяСтрока, Поле.Имя, СтандартнаяОбработка);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОтменитьСопоставление(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеВопросаПроОтменитьСопоставление", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, НСтр("ru = 'Отменить сопоставление?'"), РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьБланк(Команда)
	ОткрытьФормуИзмененияБланка();
КонецПроцедуры

&НаКлиенте
Процедура УстранитьНеоднозначность(Команда)
	ОткрытьФормуРазрешенияНеоднозначности(Элементы.ТаблицаСопоставленияДанных.ТекущаяСтрока,Элементы.ТаблицаСопоставленияДанных.ТекущийЭлемент.Имя, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВставитьВСписок(Команда)
	ЗакрытьФормуИВернутьМассивСсылок();
КонецПроцедуры

&НаКлиенте
Процедура Далее(Команда)
	ПереходКСледующемуШагуЗагрузкиДанных();
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаОДобавлениеВТабличнуюЧасть(Результат, ДополнительныеПараметры) Экспорт 
	Если Результат = КодВозвратаДиалога.Да Тогда 
		АдресЗагруженныхДанных = АдресВХранилищеТаблицыСопоставления();
		Закрыть(АдресЗагруженныхДанных);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФормуИВернутьМассивСсылок()
	ПодтверждениеЗакрытияФормы = Истина;
	МассивСсылок = Новый Массив;
	Для каждого Строка Из ТаблицаСопоставленияДанных Цикл
		Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда
			МассивСсылок.Добавить(Строка.ОбъектСопоставления);
		КонецЕсли;
	КонецЦикла;
	
	Закрыть(МассивСсылок);
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
	
	ШагНазад();
	
КонецПроцедуры

&НаКлиенте
Процедура ШагНазад()
	
	Если Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными Тогда
		
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки;
		Элементы.Назад.Видимость = Ложь;
		Заголовок = НСтр("ru = 'Загрузка данных в справочник'");
		ОчиститьТаблицу();
		
	ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных
		ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено
		ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.РезультатыСопоставления
		ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации Тогда
		
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
		Элементы.ВставитьВСписок.Видимость = Ложь;
		Элементы.Далее.КнопкаПоУмолчанию = Истина;
		Элементы.Далее.Видимость = Истина;
		Элементы.Далее.Доступность = Истина;
		Элементы.Далее.Заголовок = ?(ТипЗагрузки = "ВставкаИзБуфераОбмена",
				НСтр("ru = 'Вставить в список'"), НСтр("ru = 'Далее >'"));
		
		Если ТипЗагрузки = "ТабличнаяЧасть" ИЛИ ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
			Элементы.Назад.Видимость = Ложь;
		Иначе
			Элементы.Назад.Доступность = Истина;
		КонецЕсли;
		
	ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ОтчетОЗагрузкеДанных Тогда
		
		Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Видимость = Ложь;
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных;
		
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьШаблонВФайл(Команда)
	
	Оповещение = Новый ОписаниеОповещения("ВыгрузитьШаблонВФайлЗавершение", ЭтотОбъект);
	НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьШаблонИзФайла(Команда)
	
	ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
	
	Оповещение = Новый ОписаниеОповещения("ЗагрузитьДанныеИзФайлаВШаблон", ЭтотОбъект);
	ЗагрузкаДанныхИзФайлаКлиент.ДиалогЗагрузкиФайла(Оповещение, ИмяФайла);
	
КонецПроцедуры

&НаКлиенте
Процедура ГрупповоеИзменениеРеквизитов(Команда)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда
		Если ТаблицаОтчет.ТекущаяОбласть.Верх = 1 Тогда
			ВерхняяПозиция = 2;
		Иначе
			ВерхняяПозиция = ТаблицаОтчет.ТекущаяОбласть.Верх;
		КонецЕсли;
		МассивСсылок = ГрупповоеИзменениеРеквизитовНаСервере(ВерхняяПозиция, ТаблицаОтчет.ТекущаяОбласть.Низ);
		Если массивСсылок.Количество() > 0 Тогда
			ПараметрыФормы = Новый Структура("МассивОбъектов", МассивСсылок);
			ИмяОбъекта = "Обработка.";
			ОткрытьФорму(ИмяОбъекта + "ГрупповоеИзменениеРеквизитов.Форма", ПараметрыФормы);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

/////////////////////////////////////// КЛИЕНТ ///////////////////////////////////////////

// Завершение диалога закрытия формы.
&НаКлиенте
Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		ПодтверждениеЗакрытияФормы = Истина;
		Закрыть();
	Иначе 
		ПодтверждениеЗакрытияФормы = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПереходКСледующемуШагуЗагрузкиДанных()
	
	Если Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки Тогда
		ОписаниеСтрокиВыбора = Элементы.ВидЗагрузкиДанных.ТекущиеДанные.Значение;
		ВыполнитьШагЗаполнениеТаблицыДаннымиНаСервере(ОписаниеСтрокиВыбора);
		ВыполнитьШагЗаполнениеТаблицыДаннымиНаКлиенте();
	ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными Тогда
		СопоставитьЗагружаемыеДанные();
	ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.РезультатыСопоставления Тогда
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных;
		Элементы.ВставитьВСписок.Видимость = Ложь;
		Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'");
		Элементы.Далее.КнопкаПоУмолчанию = Истина;
		Элементы.Назад.Заголовок = НСтр("ru = '< В начало'");
	ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных Тогда
		Элементы.ВставитьВСписок.Видимость = Ложь;
		ПодтверждениеЗакрытияФормы = Истина;
		Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
			Отбор = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
			Строки = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
			Если Строки.Количество() > 0 Тогда
				Оповещение = Новый ОписаниеОповещения("ПослеВопросаОДобавлениеВТабличнуюЧасть", ЭтотОбъект);
				ПоказатьВопрос(Оповещение, НСтр("ru = 'Строки, в которых не заполнены обязательные колонки, будут пропущены.'")
					+ Символы.ПС + НСтр("ru = 'Продолжить?'"), РежимДиалогаВопрос.ДаНет);
				Возврат;
			КонецЕсли;
			
			АдресЗагруженныхДанных = АдресВХранилищеТаблицыСопоставления();
			Закрыть(АдресЗагруженныхДанных);
		ИначеЕсли ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
			Элементы.Назад.Заголовок = НСтр("ru = '< В начало_'");
			ЗакрытьФормуИВернутьМассивСсылок();
		Иначе
			Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации;
			ЗаписатьЗагружаемыеДанныеКлиент();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Параметры:
//  Результат - Произвольный
//  Параметр - см. ОписаниеПараметраСопоставленияНеоднозначностей
// 
&НаКлиенте
Процедура ПослеСопоставленияНеоднозначностей(Результат, Параметр) Экспорт
	
	Если ТипЗагрузки  = "ТабличнаяЧасть" Тогда
		Если Результат <> Неопределено Тогда
			ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_";
			
			Строка = ТаблицаСопоставленияДанных.НайтиПоИдентификатору(Параметр.Идентификатор);
			Строка[ПрефиксТабличнойЧасти + Параметр.Имя] = Результат;
			Строка.ОписаниеОшибки = СтрЗаменить(Строка.ОписаниеОшибки, Параметр.Имя + ";", "");
			Строка.РезультатСопоставленияСтроки = ?(СтрДлина(Строка.ОписаниеОшибки) = 0, 
				ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен(), ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
		КонецЕсли;
	Иначе
		Строка = ТаблицаСопоставленияДанных.НайтиПоИдентификатору(Параметр.Идентификатор);
		Строка.ОбъектСопоставления = Результат;
		Если Результат <> Неопределено Тогда
			Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
			Строка.СписокНеоднозначностей = Неопределено;
		Иначе 
			Если Строка.РезультатСопоставленияСтроки <> ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность() Тогда 
				Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен();
				Строка.СписокНеоднозначностей = Неопределено;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСопоставление()
	КоличествоСопоставленныхПоКолонкам = 0;
	СписокКолонок = "";
	ВыполнитьСопоставлениеПоВыбранномуРеквизиту(КоличествоСопоставленныхПоКолонкам, СписокКолонок);
	ПоказатьОповещениеПользователя(НСтр("ru = 'Выполнено сопоставление'"),, НСтр("ru = 'Сопоставлено элементов:'") + " " + Строка(КоличествоСопоставленныхПоКолонкам));
	ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла();
КонецПроцедуры

&НаКлиенте
Функция ВсеДанныеСопоставлены()
	Отбор = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен());
	Результат = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
	КоличествоСопоставленных = Результат.Количество();
	
	Если ТаблицаСопоставленияДанных.Количество() = КоличествоСопоставленных Тогда 
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция СтатисткаСопоставления()
	
	Отбор                    = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен());
	Результат                = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
	КоличествоСопоставленных = Результат.Количество();
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		Отбор                   = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
		Результат               = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
		КоличествоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных - Результат.Количество();
	Иначе
		Отбор                   = Новый Структура("ОписаниеОшибки", "");
		Результат               = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
		КоличествоНеоднозначных = ТаблицаСопоставленияДанных.Количество() - Результат.Количество();
	КонецЕсли;
	КоличествоНеСопоставленных  = ТаблицаСопоставленияДанных.Количество() - КоличествоСопоставленных;
	
	Результат = Новый Структура;
	Результат.Вставить("Всего",            ТаблицаСопоставленияДанных.Количество());
	Результат.Вставить("Сопоставленных",   КоличествоСопоставленных);
	Результат.Вставить("Неоднозначных",    КоличествоНеоднозначных);
	Результат.Вставить("Несопоставленных", КоличествоНеСопоставленных);
	Результат.Вставить("НеНайдено",        КоличествоНеСопоставленных - КоличествоНеоднозначных);
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла()
	
	Статистика = СтатисткаСопоставления();
	
	ТекстВсе = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все (%1)'"), Статистика.Всего);
	
	Элементы.СоздаватьЕслиНеСопоставлено.Заголовок = НСтр("ru = 'Несопоставленные ('") + Статистика.НеСопоставленных + ")";
	Элементы.ОбновлятьСуществующие.Заголовок       = НСтр("ru = 'Сопоставленные элементы ('") + Строка(Статистика.Сопоставленных) + ")";
	
	СписокВыбора = Элементы.ФильтрТаблицаСопоставления.СписокВыбора;
	СписокВыбора.Очистить();
	СписокВыбора.Добавить("Все", ТекстВсе, Истина);
	СписокВыбора.Добавить("Несопоставленные", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Несопоставленные (%1 из %2)'"),
		Статистика.НеСопоставленных, Статистика.Всего));
	СписокВыбора.Добавить("Сопоставленные", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сопоставленные (%1 из %2)'"),
		Статистика.Сопоставленных, Статистика.Всего));
	СписокВыбора.Добавить("Неоднозначные", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неоднозначные (%1 из %2)'"),
		Статистика.Неоднозначных, Статистика.Всего));
	
	Если Статистика.Неоднозначных > 0 Тогда
		Элементы.ОписаниеНеоднозначность.Видимость = Истина;
		Элементы.ОписаниеНеоднозначность.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '(неоднозначностей: %1)'"),
			Статистика.Неоднозначных);
	Иначе
		Элементы.ОписаниеНеоднозначность.Видимость = Ложь;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(ФильтрТаблицаСопоставления) Тогда 
		ФильтрТаблицаСопоставления = "Несопоставленные";
	КонецЕсли;
	
	УстановитьФильтрациюТаблицыСопоставления();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьШаблонВФайлЗавершение(Подключено, ДополнительныеПараметры) Экспорт
	
	Если Подключено Тогда
		Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаДляСохранения", ЭтотОбъект);
		ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
		ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
		ДиалогВыбораФайла.Фильтр                      = НСтр("ru = 'Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx|Электронная таблица OpenDocument (*.ods)|*.ods|Текстовый документ c разделителями (*.csv)|*.csv|Табличный документ (*.mxl)|*.mxl'");
		ДиалогВыбораФайла.Расширение                  = "xls";
		ДиалогВыбораФайла.МножественныйВыбор = Ложь;
		ДиалогВыбораФайла.ИндексФильтра               = 0;
		ДиалогВыбораФайла.ПолноеИмяФайла = ИмяФайла;
		ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(Оповещение, ДиалогВыбораФайла);
	Иначе
		Оповещение = Новый ОписаниеОповещения("ПослеВыбораРасширенияФайла", ЭтотОбъект);
		ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РасширениеФайла",, ЭтотОбъект, Истина,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьФормыОбИзменении(МассивСсылок)
	СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(МассивСсылок);
КонецПроцедуры

/////////////////////////////////////// СЕРВЕР ///////////////////////////////////////////

&НаСервере
Процедура ИнициализацияВставкиИзБуфераОбмена()
	ФильтрТаблицаСопоставления = "Несопоставленные";
	
	Если Параметры.Свойство("ПредставлениеПоля") Тогда
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Вставка из буфера обмена (%1)'"), Параметры.ПредставлениеПоля);
	Иначе
		Заголовок = НСтр("ru = 'Вставка из буфера обмена'");
	КонецЕсли;
	
	ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ВставкаИзБуфераОбмена");
	
	Обработки.ЗагрузкаДанныхИзФайла.УстановитьРежимВставкиИзБуфераОбмена(ШаблонСДанными, ИнформацияПоКолонкам, Параметры.ОписаниеТипов);
	СоздатьТаблицуСопоставленияПоИнформацииОКолонкахАвто(Параметры.ОписаниеТипов);
	
	Если ИнформацияПоКолонкам.Количество() = 1 Тогда
		Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаОднаКолонка;
		Элементы.ВариантЗагрузки.Видимость = Ложь;
		Элементы.ВставитьВСписок.Видимость = Ложь;
		Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'");
	Иначе
		Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗаполнениеТаблицы;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
	
	Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), НСтр("ru = 'Загрузка данных в справочник'"), Параметры.Заголовок);
	
	Если ОбщегоНазначения.ЭтоВебКлиент() Тогда
		Элементы.СтраницаВариантЗаполнениеТаблицы.Видимость = Ложь;
		Элементы.ВариантЗагрузки.Видимость                  = Ложь;
		Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗагрузкаИзФайла;
		Элементы.ПояснениеДляВыбораСправочникаДляЗагрузки.Заголовок = НСтр("ru = 'Выбор справочника для загрузки данных из электронных таблиц, расположенных во внешних файлах 
		| (например: Microsoft Office Excel, OpenOffice Calc и др.).'");
	КонецЕсли;
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
		Элементы.ГруппаНастройкиСопоставления.Видимость = Ложь;
		Элементы.СписокКолонокСопоставления.Видимость   = Ложь;
		Элементы.Закрыть.Заголовок = НСтр("ru = 'Отмена'");
	ИначеЕсли ТипЗагрузки = "ТабличнаяЧасть" Тогда
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
		Элементы.ГруппаНастройкиСопоставления.Видимость = Ложь;
		Элементы.СписокКолонокСопоставления.Видимость   = Ложь;
		Элементы.ГруппаИтогоНеСопоставленных.Видимость  = Ложь;
	Иначе
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки;
	КонецЕсли;
	
КонецПроцедуры

#Область ШагВыборВариантаЗагрузки

&НаСервере
Процедура ЗаполнитьСписокВидЗагрузкиДанных()
	Обработки.ЗагрузкаДанныхИзФайла.СоздатьСписокСправочниковДляЗагрузки(СписокВариантовЗагрузки);
КонецПроцедуры 

#КонецОбласти

#Область ШагЗаполнениеТаблицыДанными

&НаКлиенте
Процедура ВыполнитьШагЗаполнениеТаблицыДаннымиНаКлиенте()
	
	Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
	Элементы.Назад.Видимость = Истина;
	ВысотаШапкиШаблонаСДанными = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам), 2, 1);
	
КонецПроцедуры

&НаКлиенте
Функция ТаблицаСДаннымиПустая()
	
	Если ШаблонСДанными.ВысотаТаблицы <= ВысотаШапкиШаблонаСДанными Тогда
		Возврат Истина;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуИзмененияБланка()
	
	Перем Оповещение, ПараметрыФормы;
	
	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("ИнформацияПоКолонкам", ИнформацияПоКолонкам);
	ПараметрыФормы.Вставить("ИмяОбъектаСопоставления", ИмяОбъектаСопоставления);
	ПараметрыФормы.Вставить("ПараметрыЗагрузки", ПараметрыЗагрузки);
	
	Оповещение = Новый ОписаниеОповещения("ПослеВызоваФормыИзменитьБланк", ЭтотОбъект);
	ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РедактированиеБланка", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьПолноеИмяОбъектаМетаданных(Имя)
	ОбъектМетаданных = Метаданные.Справочники.Найти(Имя);
	Если ОбъектМетаданных <> Неопределено Тогда 
		Возврат ОбъектМетаданных.ПолноеИмя();
	КонецЕсли;
	ОбъектМетаданных = Метаданные.Документы.Найти(Имя);
	Если ОбъектМетаданных <> Неопределено Тогда 
		Возврат ОбъектМетаданных.ПолноеИмя();
	КонецЕсли;
	ОбъектМетаданных = Метаданные.ПланыВидовХарактеристик.Найти(Имя);
	Если ОбъектМетаданных <> Неопределено Тогда 
		Возврат ОбъектМетаданных.ПолноеИмя();
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции

// Параметры:
//  ОписаниеСтрокиВыбора - СправочникСсылка
//
&НаСервере
Процедура ВыполнитьШагЗаполнениеТаблицыДаннымиНаСервере(ОписаниеСтрокиВыбора)
	
	Если СтрНайти(ОписаниеСтрокиВыбора.ПолноеИмяОбъектаМетаданных, ".") > 0 Тогда
		ИмяОбъектаСопоставления = ОписаниеСтрокиВыбора.ПолноеИмяОбъектаМетаданных; 
	Иначе
		ИмяОбъектаСопоставления = ПолучитьПолноеИмяОбъектаМетаданных(ОписаниеСтрокиВыбора.ПолноеИмяОбъектаМетаданных);
	КонецЕсли;
	
	ТипЗагрузки = ОписаниеСтрокиВыбора.Тип;
	Если ТипЗагрузки = "ВнешняяЗагрузка" Тогда
		ВнешняяОбработкаСсылка = ОписаниеСтрокиВыбора.Ссылка;
		ИдентификаторКоманды = ОписаниеСтрокиВыбора.Идентификатор;
	КонецЕсли;
	ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("РежимЗапуска.ЗагрузкаВСправочник." + ИмяОбъектаСопоставления,, ТипЗагрузки);
	
	СформироватьМакетПоТипуЗагрузки();
	СоздатьТаблицуСопоставленияПоИнформацииОКолонках();
	ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки();
	
	Если ТипЗнч(ОписаниеСтрокиВыбора) = Тип("Структура") И ОписаниеСтрокиВыбора.Свойство("Представление") Тогда
		ЗаголовокОкна = ОписаниеСтрокиВыбора.Представление;
	Иначе
		ЗаголовокОкна = ПараметрыЗагрузкиНаФорме().Заголовок;
	КонецЕсли;
	Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Загрузка данных в справочник ""%1""'"), ЗаголовокОкна);
	
КонецПроцедуры

// Возвращает параметры загрузки, которые хранятся в реквизите формы.
// 
// Возвращаемое значение:
//   см. ЗагрузкаДанныхИзФайла.ПараметрыЗагрузкиИзФайла
//
&НаСервере
Функция ПараметрыЗагрузкиНаФорме()
	Возврат ПараметрыЗагрузки;
КонецФункции

&НаСервере
Процедура СформироватьМакетПоТипуЗагрузки()
	
	ПараметрыЗагрузкиПоУмолчанию = ЗагрузкаДанныхИзФайла.ПараметрыЗагрузкиИзФайла(ИмяОбъектаСопоставления);
	ПараметрыЗагрузкиПоУмолчанию.ТипЗагрузки = ТипЗагрузки;
	
	Если ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда
		АвтоЗаголовок = Ложь;
	ИначеЕсли ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда
		АвтоЗаголовок = Ложь;
		МенеджерОбъекта(ИмяОбъектаСопоставления).ОпределитьПараметрыЗагрузкиДанныхИзФайла(ПараметрыЗагрузкиПоУмолчанию);
		Заголовок = ПараметрыЗагрузкиПоУмолчанию.Заголовок;
	ИначеЕсли ТипЗагрузки = "ВнешняяЗагрузка" Тогда
		ПараметрыЗагрузкиПоУмолчанию.Вставить("ИмяМакетаСШаблоном", "ЗагрузкаДанныхИзФайла");
		Обработки.ЗагрузкаДанныхИзФайла.ПараметрыЗагрузкиИзФайлаВнешняяОбработка(ИдентификаторКоманды,
			ВнешняяОбработкаСсылка, ПараметрыЗагрузкиПоУмолчанию);
	КонецЕсли;
	
	ИнформацияПоКолонкамТаблица = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЗагрузкаДанныхИзФайла", ИмяОбъектаСопоставления,, ИмяПользователя());
	Если ИнформацияПоКолонкамТаблица = Неопределено Тогда
		ИнформацияПоКолонкамТаблица = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
	КонецЕсли;
	Обработки.ЗагрузкаДанныхИзФайла.ОпределитьИнформацияПоКолонкам(ПараметрыЗагрузкиПоУмолчанию, ИнформацияПоКолонкамТаблица);
	ЗначениеВРеквизитФормы(ИнформацияПоКолонкамТаблица, "ИнформацияПоКолонкам");
	
	ПараметрыЗагрузки = ПараметрыЗагрузкиПоУмолчанию;
	
	ИзменитьБланкПоИнформацииПоКолонкам();
КонецПроцедуры

&НаСервере
Процедура СохранитьТаблицуВCSVФайл(ПолноеИмяФайла)
	Обработки.ЗагрузкаДанныхИзФайла.СохранитьТаблицуВCSVФайл(ПолноеИмяФайла, ИнформацияПоКолонкам);
КонецПроцедуры

#КонецОбласти

#Область ШагСопоставлениеЗагруженныхДанных

&НаСервере
Процедура СкопироватьОднуКолонкуВШаблонСДанными()
	
	ОчисткаШаблонСДанными();
	
	КоличествоСтрок = СтрЧислоСтрок(ШаблонСДаннымиОднаКолонка);
	НомерСтрокиВШаблоне = 2;
	Для НомерСтроки = 1 По КоличествоСтрок Цикл 
		Строка = СтрПолучитьСтроку(ШаблонСДаннымиОднаКолонка, НомерСтроки);
		Если ЗначениеЗаполнено(Строка) Тогда
			Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтрокиВШаблоне, 1, НомерСтрокиВШаблоне, 1);
			Ячейка.ТекущаяОбласть.Текст = Строка;
			ШаблонСДанными.Вывести(Ячейка);
			НомерСтрокиВШаблоне = НомерСтрокиВШаблоне + 1;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура СопоставитьЗагружаемыеДанныеНаСервере()
	
	ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию(?(ВариантЗагрузки = 0,
		"ВариантЗагрузки.ЗаполнениеТаблицы", "ВариантЗагрузки.ИзВнешнегоФайла"));
	
	ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
	Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
		АдресЗагруженныхДанных   = "";
		АдресКопииТабличнойЧасти = "";
		СписокНеоднозначностей   =  ЗагрузкаДанныхИзФайла.НовыйСписокНеоднозначностей();
		
		Обработки.ЗагрузкаДанныхИзФайла.ТабличныйДокументВТаблицуЗначений(ШаблонСДанными, ТаблицаИнформацияПоКолонкам, АдресЗагруженныхДанных);
		
		СкопироватьСтруктуруТабличнойЧасти(АдресКопииТабличнойЧасти);
		
		МенеджерОбъекта = МенеджерОбъекта(ИмяОбъектаСопоставления);
		МенеджерОбъекта.СопоставитьЗагружаемыеДанные(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей, ИмяОбъектаСопоставления, ДополнительныеПараметры);
		
		Если НЕ РеквизитыСозданы Тогда
			СоздатьТаблицуСопоставленияПоИнформацииОКолонкахДляТЧ();
		КонецЕсли;
		ПоместитьДанныеВТаблицуСопоставления(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей);
		
	ИначеЕсли ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		ТаблицаСопоставления = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
		Обработки.ЗагрузкаДанныхИзФайла.ЗаполнитьТаблицуСопоставленияДаннымиИзШаблона(ШаблонСДанными, ТаблицаСопоставления, ИнформацияПоКолонкам);
		Обработки.ЗагрузкаДанныхИзФайла.СопоставитьЗначениеКолонкиАвто(ТаблицаСопоставления, "Ссылки");
		ЗначениеВРеквизитФормы(ТаблицаСопоставления, "ТаблицаСопоставленияДанных");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеСопоставленияНаСервере(АдресРезультата)
	
	ТаблицаСопоставления = ПолучитьИзВременногоХранилища(АдресРезультата);
	
	Если ТипЗагрузки = "ПрикладнаяЗагрузка" Тогда
		СопоставитьДанныеПрикладнаяЗагрузка(ТаблицаСопоставления);
	ИначеЕсли ТипЗагрузки = "ВнешняяЗагрузка" Тогда
		СопоставитьДанныеВнешняяОбработка(ТаблицаСопоставления);
	КонецЕсли;
	
	Отбор                    = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен());
	Результат                = ТаблицаСопоставления.НайтиСтроки(Отбор);
	
	Если Результат.Количество() = ТаблицаСопоставления.Количество() Тогда
		Пояснение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Данные сопоставлены. При необходимости возможно сопоставить данные вручную, заполнив колонку ""%1"".'"),
			ПараметрыЗагрузки.ПредставлениеОбъекта);
		ФильтрТаблицаСопоставления = Элементы.ФильтрТаблицаСопоставления.СписокВыбора.НайтиПоЗначению("");
	Иначе
		Пояснение =  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок, ПараметрыЗагрузки.ПредставлениеОбъекта);
	КонецЕсли;
	
	Элементы.ПояснениеДляПрикладнойЗагрузки.Заголовок = Пояснение;
	
	ЗначениеВРеквизитФормы(ТаблицаСопоставления, "ТаблицаСопоставленияДанных");
	
КонецПроцедуры

&НаКлиенте
Процедура СопоставитьЗагружаемыеДанные()
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		Если ПустаяСтрока(ШаблонСДаннымиОднаКолонка) Тогда
			ПоказатьПредупреждение(, (НСтр("ru = 'Для вставки сопоставленных данных в список, заполните текстовое поле.'")));
			Возврат;
		КонецЕсли;
		
		СкопироватьОднуКолонкуВШаблонСДанными();
		
	Иначе
		
		ВыполнитьШагЗаполнениеТаблицыДаннымиНаКлиенте();
		
		Если ТаблицаСДаннымиПустая() Тогда
		
			Если ВариантЗагрузки = 0 Тогда
				ПоказатьПредупреждение(, (НСтр("ru = 'Для сопоставления и загрузки данных, заполните таблицу.'")));
			Иначе
				ПоказатьПредупреждение(, (НСтр("ru = 'Невозможно выполнить сопоставление данных, т.к данные не были загружены в таблицу.
				|Возможно, имена колонок в файле не соответствуют колонкам в бланке.'")));
				Элементы.Назад.Видимость = Ложь;
			КонецЕсли;
			
			ДоступностьКнопокКомандойПанели(Истина); 
			
			Возврат;
			
		КонецЕсли;
		
	КонецЕсли;
	
	ПодтверждениеЗакрытияФормы = Ложь;
	СписокНезаполненныхКолонок = НезаполненныеОбязательныеКолонки();
	Если СписокНезаполненныхКолонок.Количество() > 0 Тогда
		Если СписокНезаполненныхКолонок.Количество() = 1 Тогда
			ТекстПроКолонки = НСтр("ru = 'Обязательная колонка""'") + " " + СписокНезаполненныхКолонок[0]
				+ НСтр("ru = '"" содержит незаполненные строки, эти строки будут пропущены при загрузке.'");
		Иначе
			ТекстПроКолонки = НСтр("ru = 'Обязательные колонки""'") + " " + СтрСоединить(СписокНезаполненныхКолонок,", ")
				+ НСтр("ru = '"" содержат незаполненные строки, эти строки будут пропущены при загрузке.'");
		КонецЕсли;
		ТекстПроКолонки = ТекстПроКолонки + Символы.ПС + НСтр("ru = 'Продолжить?'");
		
		Оповещение = Новый ОписаниеОповещения("ПослеВопросаОНезаполненныхСтроках", ЭтотОбъект);
		ПоказатьВопрос(Оповещение, ТекстПроКолонки, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
	Иначе
		ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеПроверки();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаОНезаполненныхСтроках(Результат, Параметр) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда 
		ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеПроверки();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеПроверки()
	
	ДоступностьКнопокКомандойПанели(Ложь);
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" ИЛИ ТипЗагрузки = "ТабличнаяЧасть" Тогда
		СопоставитьЗагружаемыеДанныеНаСервере();
		Если ВсеДанныеСопоставлены() И ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
			ЗакрытьФормуИВернутьМассивСсылок();
		Иначе
			ВыполнитьШагСопоставлениеЗагружаемыхДанныхКлиент();
		КонецЕсли;
	Иначе
		ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
		ФоновоеЗадание = СопоставитьЗагружаемыеДанныеНаСервереУниверсальнаяЗагрузка();
		Если ФоновоеЗадание.Статус = "Выполняется" Тогда
			Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации;
		КонецЕсли;
	
		НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
		НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
		
		Обработчик = Новый ОписаниеОповещения("ПослеСопоставленияЗагружаемыхДанных", ЭтотОбъект);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДоступностьКнопокКомандойПанели(Доступность)
	
	Элементы.Назад.Доступность = Доступность;
	Элементы.Далее.Доступность = Доступность;

КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКСтранице(ОтображаемаяСтраница)
	
	ДоступностьКнопокКомандойПанели(Истина);
	Элементы.СтраницыПомощника.ТекущаяСтраница = ОтображаемаяСтраница;
КонецПроцедуры

#Область ДлительныеОперации

&НаКлиенте
Процедура ЗаписатьЗагружаемыеДанныеКлиент()
	
	ДоступностьКнопокКомандойПанели(Ложь);
	
	ПредставлениеОбъекта = ПараметрыЗагрузки.ПредставлениеОбъекта;
	Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Заголовок = 
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Заголовок,
			ПредставлениеОбъекта);
	Элементы.ПояснениеОтчетаОЗагрузке.Заголовок = 
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ПояснениеОтчетаОЗагрузке.Заголовок, ПредставлениеОбъекта);
	
	Если ТипЗагрузки <> "УниверсальнаяЗагрузка" Тогда
		СсылкиНаОбъектыОповещения = Новый Массив;
		
		ОбработатьЗагружаемыеДанные(СсылкиНаОбъектыОповещения);
		ОповеститьФормыОбИзменении(СсылкиНаОбъектыОповещения);
		
		ФоновоеЗаданиеОтчетНаКлиенте();
	Иначе
		ФоновоеЗаданиеПроцент = 0;
		ФоновоеЗадание = ЗаписатьЗагружаемыеДанныеОтчетУниверсальнаяЗагрузка();
		Если ФоновоеЗадание.Статус = "Выполняется" Тогда
			Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации;
		КонецЕсли;
		
		ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
		НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
		НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения;
		
		Обработчик = Новый ОписаниеОповещения("ПослеЗаписиЗагружаемыхДанныхОтчет", ЭтотОбъект);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ФоновоеЗаданиеОтчетНаКлиенте(НеВыводитьОкноОжидания = Истина)
	
	ФоновоеЗадание = СформироватьОтчетОЗагрузке(ФильтрОтчет, НеВыводитьОкноОжидания);
	
	НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	НастройкиОжидания.ВыводитьОкноОжидания = НЕ НеВыводитьОкноОжидания;
		
	Обработчик = Новый ОписаниеОповещения("ПослеСозданияОтчета", ЭтотОбъект);
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьОтчет(АдресРезультата)
	
	Отчет = ПолучитьИзВременногоХранилища(АдресРезультата);
	
	Если Элементы.СтраницыПомощника.ТекущаяСтраница <> Элементы.ОтчетОЗагрузкеДанных Тогда
		ВыполнитьШагОтчетОЗагрузкеДанныхКлиент();
	КонецЕсли;
	
	ИтогоОтчетСоздано = Отчет.Создано;
	ИтогоОтчетОбновлено = Отчет.Обновлено;
	ИтогоОтчетПропущено = Отчет.Пропущено;
	ИтогоОтчетНекорректных = Отчет.Некорректных;
	
	Элементы.ФильтрОтчет.СписокВыбора.Очистить();
	Элементы.ФильтрОтчет.СписокВыбора.Добавить("ВсеЭлементы", НСтр("ru = 'Все ('") + Отчет.Всего + ")");
	Элементы.ФильтрОтчет.СписокВыбора.Добавить("Новые", НСтр("ru = 'Новые ('") + Отчет.Создано+ ")");
	Элементы.ФильтрОтчет.СписокВыбора.Добавить("Обновленные", НСтр("ru = 'Обновленные ('") + Отчет.Обновлено+ ")");
	Элементы.ФильтрОтчет.СписокВыбора.Добавить("Пропущенные", НСтр("ru = 'Пропущенные ('") + Отчет.Пропущено+ ")");
	ФильтрОтчет = Отчет.ТипОтчета;

	ТаблицаОтчет = Отчет.ТаблицаОтчет;
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиСообщениеОбОшибке(ТекстОшибкиДляПользователя, ТехническаяИнформация)
	ТекстСообщенияОбОшибке = ТекстОшибкиДляПользователя + Символы.ПС
		+ НСтр("ru = 'Возможная причина: Загружаемые данные некорректные.
					|Техническая информация: %1'");
	ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщенияОбОшибке, ТехническаяИнформация);
	ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщенияОбОшибке);
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхКлиент()
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
		Статистика = СтатисткаСопоставления();
		
		Если Статистика.Сопоставленных > 0 Тогда
			ТекстНайдено = НСтр("ru = 'Из %1 введенных строк в список будут вставлены: %2.'");
			Элементы.НадписьРезультатСопоставления.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНайдено,
				Статистика.Всего, Статистика.Сопоставленных);
			
			Если Статистика.Неоднозначных > 0 И Статистика.НеНайдено > 0 Тогда 
				ТекстНеНайдено = НСтр("ru = 'Будет пропущено строк: %3
				|  - Нет данных в программе: %1
				|  - Несколько вариантов для вставки: %2'");
				ТекстНеНайдено = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНеНайдено, Статистика.НеНайдено, Статистика.Неоднозначных, Статистика.Несопоставленных);
			ИначеЕсли Статистика.Неоднозначных > 0 Тогда
				ТекстНеНайдено = НСтр("ru = 'Строки, для которых в программе имеется несколько вариантов, будут пропущены: %1'");
				ТекстНеНайдено = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНеНайдено, Статистика.Неоднозначных);
			ИначеЕсли Статистика.НеНайдено > 0 Тогда
				ТекстНеНайдено = НСтр("ru = 'Строки, для которых в программе нет соответствующих данных, будут пропущены: %1'");
				ТекстНеНайдено = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстНеНайдено, Статистика.НеНайдено);
			КонецЕсли;
			ТекстНеНайдено = ТекстНеНайдено + Символы.ПС + НСтр("ru = 'Для просмотра пропущенных строк и подбора данных для вставки нажмите ""Далее"".'");
			Элементы.ДекорацияНеНайденоИНеоднозначность.Заголовок = ТекстНеНайдено;
			
			Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.РезультатыСопоставления;
			Элементы.Назад.Видимость = Истина;
			Элементы.ВставитьВСписок.Видимость = Истина;
			Элементы.Далее.Видимость = Истина;
			Элементы.Назад.Заголовок = НСтр("ru = '< Назад'");
			Элементы.Далее.Заголовок = НСтр("ru = 'Далее >'");
			Элементы.Далее.АктивизироватьПоУмолчанию = Ложь;
			Элементы.ВставитьВСписок.АктивизироватьПоУмолчанию = Истина;
			Элементы.ВставитьВСписок.КнопкаПоУмолчанию = Истина;
			
			ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла();
			УстановитьОформлениеДляСтраницыСопоставления(Ложь, Элементы.ПояснениеДляПоискаСсылок, Ложь, НСтр("ru = 'Далее >'"));
		Иначе
			Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено;
			Элементы.Закрыть.Заголовок = НСтр("ru = 'Закрыть'");
			Элементы.Назад.Видимость = Истина;
			Элементы.ВставитьВСписок.Видимость = Ложь;
			Элементы.Далее.Видимость = Ложь;
		КонецЕсли;
		
	Иначе 
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных;
		ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла();
		
		Если ТипЗагрузки = "УниверсальнаяЗагрузка" Тогда
			УстановитьОформлениеДляСтраницыСопоставления(Истина, Элементы.ПояснениеДляСопоставленияДанных, Истина, НСтр("ru = 'Загрузить данные >'"));
		ИначеЕсли ТипЗагрузки = "ТабличнаяЧасть" Тогда
			ОтборНеСопоставлен = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
			ОтборНеоднозначность = Новый Структура("РезультатСопоставленияСтроки", ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность());
			Если ТаблицаСопоставленияДанных.НайтиСтроки(ОтборНеСопоставлен).Количество() = 0
				И ТаблицаСопоставленияДанных.НайтиСтроки(ОтборНеоднозначность).Количество() = 0 Тогда
				// Все строки сопоставлены
				ПереходКСледующемуШагуЗагрузкиДанных();
			КонецЕсли;
			
			УстановитьОформлениеДляСтраницыСопоставления(Ложь, Элементы.ПояснениеДляТабличнойЧасти, Истина, НСтр("ru = 'Загрузить данные'"));
			УстановитьОформлениеДляПолейСНеоднозначностью(ОтборНеоднозначность);
		Иначе
			УстановитьОформлениеДляСтраницыСопоставления(Ложь, Элементы.ПояснениеДляПрикладнойЗагрузки, Ложь, НСтр("ru = 'Загрузить данные >'"));
		КонецЕсли;
	КонецЕсли;
	
	ДоступностьКнопокКомандойПанели(Истина);

КонецПроцедуры

&НаКлиенте
Процедура УстановитьОформлениеДляСтраницыСопоставления(ВидимостьКнопкиСопоставление, ЭлементДляПоясняющегоТекста, ВидимостьКнопкиУстранитьНеоднозначность, ТекстКнопкиДалее)
	
	Элементы.СписокКолонокСопоставления.Видимость = ВидимостьКнопкиСопоставление;
	Элементы.Назад.Видимость = Истина;
	Элементы.ПояснениеДляПрикладнойЗагрузки.Видимость = Ложь;
	Элементы.ПояснениеДляТабличнойЧасти.Видимость = Ложь;
	Элементы.ПояснениеДляПоискаСсылок.Видимость = Ложь;
	Если ЭлементДляПоясняющегоТекста = Элементы.ПояснениеДляТабличнойЧасти Тогда
		Элементы.ПояснениеДляТабличнойЧасти.Видимость = Истина;
	ИначеЕсли ЭлементДляПоясняющегоТекста = Элементы.ПояснениеДляПоискаСсылок Тогда
		Элементы.ПояснениеДляПоискаСсылок.Видимость = Истина;
		Элементы.ПояснениеДляСопоставленияДанных.ОтображатьЗаголовок = Ложь;
	ИначеЕсли ЭлементДляПоясняющегоТекста = Элементы.ПояснениеДляПрикладнойЗагрузки Тогда
		Элементы.ПояснениеДляПрикладнойЗагрузки.Видимость = Истина;
	КонецЕсли;
	
	Элементы.УстранитьНеоднозначность.Видимость = ВидимостьКнопкиУстранитьНеоднозначность;
	Элементы.Далее.Заголовок = ТекстКнопкиДалее;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуРазрешенияНеоднозначности(ВыбраннаяСтрока, ПолеИмя, СтандартнаяОбработка)
	Строка = ТаблицаСопоставленияДанных.НайтиПоИдентификатору(ВыбраннаяСтрока);
	
	Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
		Если Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность()
		   И СтрДлина(Строка.ОписаниеОшибки) > 0 Тогда
			ПрефиксНачалаТабличнойЧасти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2_", 
				ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТаблицыСопоставления(), 
				ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти());
			Если СтрДлина(ПолеИмя) > 3 И СтрНачинаетсяС(ПолеИмя, ПрефиксНачалаТабличнойЧасти) Тогда
				Имя = Сред(ПолеИмя, СтрДлина(ПрефиксНачалаТабличнойЧасти) + 1);
				Если СтрНайти(Строка.ОписаниеОшибки, Имя) Тогда
					СтандартнаяОбработка = Ложь;
					СтрокаИзТаблицы = Новый Массив;
					ЗначенияЗагружаемыхКолонок = Новый Структура();
					Для каждого Колонка Из ИнформацияПоКолонкам Цикл
						МассивКолонок = Новый Массив();
						МассивКолонок.Добавить(Колонка.ИмяКолонки);
						МассивКолонок.Добавить(Колонка.ПредставлениеКолонки);
						МассивКолонок.Добавить(Строка["ФЛ_" + Колонка.ИмяКолонки]);
						МассивКолонок.Добавить(Колонка.ТипКолонки);
						СтрокаИзТаблицы.Добавить(МассивКолонок);
						Если Имя = Колонка.Родитель Тогда
							ЗначенияЗагружаемыхКолонок.Вставить(Колонка.ИмяКолонки, Строка["ФЛ_" + Колонка.ИмяКолонки]);
						КонецЕсли;
					КонецЦикла;
					
					ПараметрыФормы = Новый Структура();
					ПараметрыФормы.Вставить("ТипЗагрузки", ТипЗагрузки);
					ПараметрыФормы.Вставить("Имя", Имя);
					ПараметрыФормы.Вставить("СтрокаИзТаблицы", СтрокаИзТаблицы);
					ПараметрыФормы.Вставить("ЗначенияЗагружаемыхКолонок", ЗначенияЗагружаемыхКолонок);
					ПараметрыФормы.Вставить("СписокНеоднозначностей", Неопределено);
					ПараметрыФормы.Вставить("ПолноеИмяТабличнойЧасти", ИмяОбъектаСопоставления);
					ПараметрыФормы.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
					
					Параметр = ОписаниеПараметраСопоставленияНеоднозначностей(ВыбраннаяСтрока, Имя);
					
					Оповещение = Новый ОписаниеОповещения("ПослеСопоставленияНеоднозначностей", ЭтотОбъект, Параметр);
					ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РазрешенияНеоднозначностей", ПараметрыФормы, ЭтотОбъект, Истина , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность() Тогда
			СтандартнаяОбработка = Ложь;
			
			СтрокаИзТаблицы = Новый Массив;
			Для каждого Колонка Из ИнформацияПоКолонкам Цикл 
				МассивКолонок = Новый Массив();
				МассивКолонок.Добавить(Колонка.ИмяКолонки);
				МассивКолонок.Добавить(Колонка.ПредставлениеКолонки);
				МассивКолонок.Добавить(Строка[Колонка.ИмяКолонки]);
				МассивКолонок.Добавить(Колонка.ТипКолонки);
				СтрокаИзТаблицы.Добавить(МассивКолонок);
			КонецЦикла;
			
			КолонкиСопоставления = Новый СписокЗначений;
			Для каждого Элемент Из СопоставитьПоКолонке Цикл 
				Если Элемент.Пометка Тогда
					КолонкиСопоставления.Добавить(Элемент.Значение);
				КонецЕсли;
			КонецЦикла;
			
			ПараметрыФормы = Новый Структура();
			ПараметрыФормы.Вставить("СтрокаИзТаблицы", СтрокаИзТаблицы);
			ПараметрыФормы.Вставить("СписокНеоднозначностей", Строка.СписокНеоднозначностей);
			ПараметрыФормы.Вставить("КолонкиСопоставления", КолонкиСопоставления);
			ПараметрыФормы.Вставить("ТипЗагрузки", ТипЗагрузки);
			
			Параметр = Новый Структура("Идентификатор", ВыбраннаяСтрока);
			
			Оповещение = Новый ОписаниеОповещения("ПослеСопоставленияНеоднозначностей", ЭтотОбъект, Параметр);
			ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РазрешенияНеоднозначностей", ПараметрыФормы, ЭтотОбъект, Истина , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Возвращаемое значение:
//   Структура:
//    * Идентификатор - Число
//    * Имя - Строка
//
&НаКлиенте
Функция ОписаниеПараметраСопоставленияНеоднозначностей(Знач ВыбраннаяСтрока, Знач Имя)
	
	Параметр = Новый Структура();
	Параметр.Вставить("Идентификатор", ВыбраннаяСтрока);
	Параметр.Вставить("Имя", Имя);
	
	Возврат Параметр;
	
КонецФункции

&НаСервере
Процедура СопоставитьДанныеПрикладнаяЗагрузка(ТаблицаСопоставленияДанныхСервер)
	
	МенеджерОбъект = МенеджерОбъекта(ИмяОбъектаСопоставления);
	
	МенеджерОбъект.СопоставитьЗагружаемыеДанныеИзФайла(ТаблицаСопоставленияДанныхСервер);
	Для каждого Строка Из ТаблицаСопоставленияДанныхСервер Цикл 
		Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда 
			Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ШагОтчетОЗагрузке

&НаСервере
Процедура ОбработатьЗагружаемыеДанные(СсылкиНаОбъектыОповещения)
	
	СопоставленныеДанные = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	
	Если ТипЗагрузки = "ВнешняяЗагрузка" Тогда
		ЗаписатьСопоставленныеДанныеВнешняяОбработка(СопоставленныеДанные);
		ЗначениеВРеквизитФормы(СопоставленныеДанные, "ТаблицаСопоставленияДанных");
	Иначе
		ЗаписатьСопоставленныеДанныеПрикладнаяЗагрузка(СопоставленныеДанные);
		ЗначениеВРеквизитФормы(СопоставленныеДанные, "ТаблицаСопоставленияДанных");
	КонецЕсли;
	
	ПодготовитьСписокДляОповещения(СопоставленныеДанные, СсылкиНаОбъектыОповещения);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПодготовитьСписокДляОповещения(СопоставленныеДанные, СсылкиНаОбъектыОповещения)
	
	СсылкиНаОбъекты = Новый Массив;
	Для каждого СтрокаСопоставленныхДанных Из СопоставленныеДанные Цикл
		СсылкиНаОбъекты.Добавить(СтрокаСопоставленныхДанных.ОбъектСопоставления);
	КонецЦикла;
	
	СсылкиНаОбъектыОповещения = СтандартныеПодсистемыСервер.ПодготовитьОповещениеФормОбИзменении(СсылкиНаОбъекты);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьШагОтчетОЗагрузкеДанныхКлиент()
	
	Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ОтчетОЗагрузкеДанных;
	Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Видимость = Истина;
	Элементы.Закрыть.Заголовок = НСтр("ru = 'Готово'");
	Элементы.Далее.Видимость = Ложь;
	Элементы.Назад.Видимость = Ложь;
	
КонецПроцедуры

#КонецОбласти

// Параметры:
//   ТаблицаИнформацияПоКолонкам - ТаблицаЗначений
//   КолонкиМакета - Массив из см. ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета
//
&НаСервере
Процедура ОпределитьДинамическийМакет(ТаблицаИнформацияПоКолонкам, КолонкиМакета)
	
	ТаблицаИнформацияПоКолонкам = ИнформацияПоКолонкам();
	ТаблицаИнформацияПоКолонкам.Очистить();
	
	Для каждого Колонка Из КолонкиМакета Цикл
		Если Колонка.Позиция <> Неопределено Тогда
			Строка = ТаблицаИнформацияПоКолонкам.Добавить();
			Строка.ИмяКолонки = Колонка.Имя;
			Строка.Ширина = ?(ЗначениеЗаполнено(Колонка.Ширина), Колонка.Ширина, 20);
			Строка.Примечание = Колонка.Подсказка;
			ЗаполнитьЗначенияСвойств(Строка, Колонка,, "Ширина");
			Строка.Видимость = Истина;
			Строка.ПредставлениеКолонки = Колонка.Заголовок;
			Строка.ТипКолонки = Колонка.Тип;
			КонецЕсли;
	КонецЦикла;

	КорректировкаПозицийКолонок(ТаблицаИнформацияПоКолонкам);
	
КонецПроцедуры

&НаСервере
Процедура КорректировкаПозицийКолонок(ТаблицаИнформацияПоКолонкам)

	ТаблицаИнформацияПоКолонкам.Сортировать("Позиция");
	Позиция = 1;
	
	Для Каждого ИнформацияОКолонке Из ТаблицаИнформацияПоКолонкам Цикл
		
		ИнформацияОКолонке.Позиция = Позиция;
		Позиция = Позиция + 1;
		
	КонецЦикла;
	
КонецПроцедуры

// Возвращаемое значение:
//  ТаблицаЗначений:
//    * ИмяКолонки - Строка
//    * ПредставлениеКолонки - Строка
//    * ТипКолонки - Произвольный
//    * ОбязательнаДляЗаполнения - Булево
//    * Позиция - Число
//    * Группа - Строка
//    * Родитель - Строка
//    * Видимость - Булево
//    * Примечание - Строка
//    * Ширина - Число
//    * Синоним - Строка
//
&НаСервере
Функция ИнформацияПоКолонкам()
	
	ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
	Возврат ТаблицаИнформацияПоКолонкам ;
	
КонецФункции

&НаСервере
Процедура ОчиститьТаблицу()
	
	ТаблицаСопоставленияДанныхСервер = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	ТаблицаСопоставленияДанныхСервер.Колонки.Очистить();
	ИнформацияПоКолонкам.Очистить();
	
	Пока Элементы.ТаблицаСопоставленияДанных.ПодчиненныеЭлементы.Количество() > 0 Цикл
		Элементы.Удалить(Элементы.ТаблицаСопоставленияДанных.ПодчиненныеЭлементы.Получить(0));
	КонецЦикла;
	ШаблонСДанными = Новый ТабличныйДокумент;
	
	РеквизитыТаблицыСопоставления = ПолучитьРеквизиты("ТаблицаСопоставленияДанных");
	МассивПутейРеквизитов = Новый Массив;
	Для каждого РеквизитТаблицы Из РеквизитыТаблицыСопоставления Цикл
		МассивПутейРеквизитов.Добавить("ТаблицаСопоставленияДанных." + РеквизитТаблицы.Имя);
	КонецЦикла;
	Если МассивПутейРеквизитов.Количество() > 0 Тогда
		ИзменитьРеквизиты(,МассивПутейРеквизитов);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция УстановитьОформлениеДляПолейСНеоднозначностью(Отбор)
	
	Строки = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
	Если Строки.Количество() > 0 Тогда
		СписокКолонок = Новый Массив;
		Для каждого СтрокаДанных Из Строки Цикл
			Если СтрСравнить(СтрокаДанных.РезультатСопоставленияСтроки, 
				ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность()) = 0 Тогда
				МассивКолонок = СтрРазделить(СтрокаДанных.ОписаниеОшибки, ";", Ложь);
				Для каждого ИмяКолонки Из МассивКолонок Цикл
					СписокКолонок.Добавить(ИмяКолонки);
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	Иначе 
		Возврат Ложь;
	КонецЕсли;
	
	УстановитьОформлениеДанных(СписокКолонок);
	Возврат Истина;
КонецФункции

&НаСервере
Процедура УстановитьОформлениеДанных(СписокКолонок = Неопределено)
	
	
	Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда 
		ТекстОбъектНеНайден = НСтр("ru = '<Не найден>'");
		ЦветОбъектНеНайден = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет;
		ЦветНеоднозначность = ЦветаСтиля.ПоясняющийОшибкуТекст;
	Иначе
		ТекстОбъектНеНайден = НСтр("ru = '<Новый>'");
		ЦветОбъектНеНайден = ЦветаСтиля.РезультатУспехЦвет;
		ЦветНеоднозначность = ЦветаСтиля.ПоясняющийОшибкуТекст;
	КонецЕсли;
	
	УсловноеОформление.Элементы.Очистить();
	ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
	
	ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ОбъектСопоставления");
	ПолеОформления.Использование = Истина;
	
	ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаСопоставленияДанных.ОбъектСопоставления"); 
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	ЭлементОтбора.Использование = Истина;
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветОбъектНеНайден);
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", ТекстОбъектНеНайден);
	
	ПрефиксТаблицыСопоставления = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТаблицыСопоставления();
	
	Если ЗначениеЗаполнено(СписокКолонок) Тогда
		ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти();
		
		Для каждого ИмяКолонки Из СписокКолонок Цикл
			ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
			ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
			ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2_%3",
				ПрефиксТаблицыСопоставления, ПрефиксТабличнойЧасти, ИмяКолонки));
			ПолеОформления.Использование = Истина;
			ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаСопоставленияДанных.РезультатСопоставленияСтроки");
			ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
			ЭлементОтбора.ПравоеЗначение = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность();
			ЭлементОтбора.Использование = Истина;
			ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветНеоднозначность);
			ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
			ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<неоднозначность>'"));
		КонецЦикла;
	Иначе
		ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
		ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
		ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2",
			ПрефиксТаблицыСопоставления, "ОбъектСопоставления"));
		ПолеОформления.Использование = Истина;
		ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаСопоставленияДанных.РезультатСопоставленияСтроки");
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.ПравоеЗначение = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность();
		ЭлементОтбора.Использование = Истина;
		ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветНеоднозначность);
		ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
		ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<неоднозначность>'"));
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ИнформацияОКолонке(ИмяКолонки)
	Отбор = Новый Структура("ИмяКолонки", ИмяКолонки);
	Результат = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
	Если Результат.Количество() > 0 Тогда
		Возврат Результат[0];
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция ИнформацияОбОбъектеМетаданныхПоТипу(ПолныйТипОбъекта)
	ОписаниеОбъекта = Новый Структура("ТипОбъекта, ИмяОбъекта");
	ПолноеИмя = Метаданные.НайтиПоТипу(ПолныйТипОбъекта).ПолноеИмя();
	Результат = СтрРазделить(ПолноеИмя, ".", Ложь);
	Если Результат.Количество()>1 Тогда
		ОписаниеОбъекта.ТипОбъекта = Результат[0];
		ОписаниеОбъекта.ИмяОбъекта = Результат[1];
		
		Возврат ОписаниеОбъекта;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции 

&НаСервере
Функция УсловияПоВыбраннымКолонкам(ИмяСправочника)
	
	ТипСравнения   = " = ";
	СтрокаУсловие  = "";
	ТабличнаяЧасть = "";
	ОтборГде       = Новый Массив;
	СтрокиУсловия  = Новый Массив;
	ШаблонУсловияКонтактнаяИнформация = "ВЫРАЗИТЬ(СправочникСопоставления.Представление КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления.%1 КАК Строка(500))";
	ШаблонУсловияДополнительныйРеквизит = "СправочникСопоставления.Значение =  ТаблицаСопоставления.%1";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
		МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
		ВидыКонтактнойИнформации = МодульУправлениеКонтактнойИнформацией.ВидыКонтактнойИнформацииОбъекта(Справочники[ИмяСправочника].ПустаяСсылка());
	КонецЕсли;
	
	Для каждого Элемент Из СопоставитьПоКолонке Цикл
		Если Элемент.Пометка Тогда

			Колонка = ИнформацияОКолонке(Элемент.Значение);
			Если Колонка = Неопределено Тогда
				Продолжить;
			КонецЕсли;
				
			Если СтрНачинаетсяС(Колонка.ИмяКолонки, "КонтактнаяИнформация_") Тогда
				
				ИмяВидаКИ = СтандартныеПодсистемыСервер.ПреобразоватьАдаптированноеНаименованиеКолонкиВСтроку(
					Сред(Колонка.ИмяКолонки, СтрДлина("КонтактнаяИнформация_") + 1));
				НайденныеВиды = ВидыКонтактнойИнформации.Найти(ИмяВидаКИ, "Наименование");
				
				ТабличнаяЧасть = "КонтактнаяИнформация";
				СтрокаУсловие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонУсловияКонтактнаяИнформация, Колонка.ИмяКолонки);
				Если НайденныеВиды <> Неопределено Тогда
					
					НаименованиеВида = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НайденныеВиды.Ссылка, "Наименование");
					Если НаименованиеВида <> Неопределено Тогда
						СтрокаУсловие = СтрокаУсловие + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							" И СправочникСопоставления.Вид.Наименование = ""%1""", НаименованиеВида);
					КонецЕсли;
					
				КонецЕсли;
				СтрокиУсловия.Добавить(СтрокаУсловие);
				ОтборГде.Добавить("СправочникСопоставления.Представление <> """"");
				Продолжить;
				
			ИначеЕсли СтрНачинаетсяС(Колонка.ИмяКолонки, "ДополнительныйРеквизит_") Тогда
				ИмяКолонкиСправочника = "Значение";
				ТабличнаяЧасть = "ДополнительныеРеквизиты";
				СтрокиУсловия.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонУсловияДополнительныйРеквизит, Колонка.ИмяКолонки));
				
				ТипКолонки = Колонка.ТипКолонки.Типы()[0];
				Если ТипЗнч(ТипКолонки) = Тип("Строка") И Колонка.ТипКолонки.КвалификаторыСтроки.Длина = 0 Тогда
					Продолжить; // Нельзя сравнивать строки неограниченной длины.
				КонецЕсли;
				
				ОбъектаТипаКолонки = Метаданные.НайтиПоТипу(ТипКолонки);
				Если ОбъектаТипаКолонки <> Неопределено Тогда      
					ШаблонГде = "СправочникСопоставления.Значение <> ЗНАЧЕНИЕ(%1.ПустаяСсылка)";
					ОтборГде.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонГде, ОбъектаТипаКолонки.ПолноеИмя()));
				КонецЕсли;
				Продолжить;
			КонецЕсли;
			
			ИмяКолонкиСправочника = "Ссылка." + Колонка.ИмяКолонки;
			
			ТипКолонки = Колонка.ТипКолонки.Типы()[0];
			Если ТипКолонки = Тип("Строка") Тогда 
				Если Колонка.ТипКолонки.КвалификаторыСтроки.Длина = 0 Тогда
					СтрокиУсловия.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						"ВЫРАЗИТЬ(СправочникСопоставления.%1 КАК Строка(500)) = ВЫРАЗИТЬ(ТаблицаСопоставления.%2 КАК  Строка(500))", 
						ИмяКолонкиСправочника, Колонка.ИмяКолонки));
				Иначе
					СтрокиУсловия.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						"СправочникСопоставления.%1 = ТаблицаСопоставления.%2", ИмяКолонкиСправочника, Колонка.ИмяКолонки));
				КонецЕсли;
				ШаблонГде = "СправочникСопоставления.%1 <> """"";
				ОтборГде.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонГде, ИмяКолонкиСправочника));
			ИначеЕсли ТипКолонки = Тип("Число") Или ТипКолонки = Тип("Дата") Или ТипКолонки = Тип("Булево") Тогда
				СтрокиУсловия.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					"СправочникСопоставления.%1 =  ТаблицаСопоставления.%2", ИмяКолонкиСправочника, Колонка.ИмяКолонки));
			Иначе
				ИнфоОбъект = ИнформацияОбОбъектеМетаданныхПоТипу(ТипКолонки);
				Если ИнфоОбъект.ТипОбъекта = "Справочник" Тогда
					ТекстУсловияСправочник = Новый Массив;
					Справочник = Метаданные.Справочники.Найти(ИнфоОбъект.ИмяОбъекта); // ОбъектМетаданныхСправочник
					Для каждого СтрокаВвода Из Справочник.ВводПоСтроке Цикл 
						Если СтрокаВвода.Имя = "Код" И НЕ Справочник.Автонумерация Тогда 
							ТекстУсловияВВодаПоСтроке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								"СправочникСопоставления.%1.Код %2 ТаблицаСопоставления.%3", // АПК:1297 Фрагмент запроса не локализуется.
								ИмяКолонкиСправочника, ТипСравнения, Колонка.ИмяКолонки);
						Иначе
							ТекстУсловияВВодаПоСтроке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								"СправочникСопоставления.%1.%2 %3 ТаблицаСопоставления.%4", // АПК:1297 Фрагмент запроса не локализуется.
								ИмяКолонкиСправочника, СтрокаВвода.Имя, ТипСравнения, Колонка.ИмяКолонки);
						КонецЕсли;
						ТекстУсловияСправочник.Добавить(ТекстУсловияВВодаПоСтроке);
					КонецЦикла;
					СтрокиУсловия.Добавить(" ( " + СтрСоединить(ТекстУсловияСправочник, " ИЛИ ") + " )");
				ИначеЕсли ИнфоОбъект.ТипОбъекта = "Перечисление" Тогда
					СтрокиУсловия.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						"СправочникСопоставления.%1 =  ТаблицаСопоставления.%2", ИмяКолонкиСправочника, Колонка.ИмяКолонки));	
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
	КонецЦикла;
	
	Условия = Новый Структура("УсловиеОбъединения , Где, ТабличнаяЧасть");
	Условия.УсловиеОбъединения  = СтрСоединить(СтрокиУсловия, " И ");
	Условия.Где = СтрСоединить(ОтборГде, " И ");
	Условия.ТабличнаяЧасть = ТабличнаяЧасть;
	Возврат Условия;
	
КонецФункции

&НаСервере
Процедура ВыполнитьСопоставлениеПоВыбранномуРеквизиту(КоличествоСопоставленных = 0, СписокКолонокСопоставления = "")
	
	СтруктураОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления);
	ИмяСправочника   = СтруктураОбъекта.НазваниеОбъекта;
	Условия          = УсловияПоВыбраннымКолонкам(ИмяСправочника);
	
	Если Не ЗначениеЗаполнено(Условия.УсловиеОбъединения) Тогда
		Возврат;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Условия.ТабличнаяЧасть) Тогда
		ИмяСправочника = ИмяСправочника + "." + Условия.ТабличнаяЧасть;
	КонецЕсли;
	
	ТаблицаСопоставления = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	
	СписокКолонок = "";
	Разделитель   = "";
	
	Для каждого Колонка Из ТаблицаСопоставления.Колонки Цикл
		Если Колонка.Имя <> "СписокНеоднозначностей" И Колонка.Имя <> "РезультатСопоставленияСтроки" И Колонка.Имя <> "ОписаниеОшибки" Тогда
			СписокКолонок = СписокКолонок + Разделитель + Колонка.Имя;
			Разделитель   = ", ";
		КонецЕсли;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	&СписокКолонок
	|ПОМЕСТИТЬ ТаблицаСопоставления
	|ИЗ
	|	&ТаблицаСопоставления КАК ТаблицаСопоставления
	|;
	|
	|ВЫБРАТЬ
	|	СправочникСопоставления.Ссылка,
	|	ТаблицаСопоставления.Идентификатор
	|ИЗ
	|	ТаблицаСопоставления КАК ТаблицаСопоставления
	|		ЛЕВОЕ СОЕДИНЕНИЕ &СправочникСопоставления КАК СправочникСопоставления
	|		ПО &УсловиеОбъединения
	|ГДЕ
	|	СправочникСопоставления.Ссылка.ПометкаУдаления = ЛОЖЬ
	|	И &Условия
	|УПОРЯДОЧИТЬ ПО
	|	ТаблицаСопоставления.Идентификатор
	|ИТОГИ
	|ПО
	|	ТаблицаСопоставления.Идентификатор";
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&СписокКолонок", СписокКолонок);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&СправочникСопоставления", "Справочник." + ИмяСправочника);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОбъединения", Условия.УсловиеОбъединения);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условия", ?(ПустаяСтрока(Условия.Где), "ИСТИНА", Условия.Где));
	Запрос.УстановитьПараметр("ТаблицаСопоставления", ТаблицаСопоставления);
	
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Строка = ТаблицаСопоставления.Найти(ВыборкаДетальныеЗаписи.Идентификатор, "Идентификатор");
		
		Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда
			Продолжить;
		КонецЕсли;
		
		ВыборкаДетальныеЗаписиГруппа = ВыборкаДетальныеЗаписи.Выбрать();
		
		Если ВыборкаДетальныеЗаписиГруппа.Количество() > 1 Тогда
			СписокНеоднозначностей = Новый СписокЗначений;
			Пока ВыборкаДетальныеЗаписиГруппа.Следующий() Цикл
				СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписиГруппа.Ссылка);
			КонецЦикла;
			Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность();
			Строка.ОписаниеОшибки = СписокКолонокСопоставления;
			Строка.СписокНеоднозначностей = СписокНеоднозначностей;
		Иначе
			ВыборкаДетальныеЗаписиГруппа.Следующий();
			КоличествоСопоставленных = КоличествоСопоставленных + 1;
			Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
			Строка.ОписаниеОшибки = "";
			Строка.ОбъектСопоставления = ВыборкаДетальныеЗаписиГруппа.Ссылка;
		КонецЕсли;
	КонецЦикла;
	
	СписокКолонокСопоставления = "";
	Разделитель = "";
	Для каждого Колонка Из СопоставитьПоКолонке Цикл
		Если Колонка.Пометка Тогда
			СписокКолонокСопоставления = СписокКолонокСопоставления + Разделитель + Колонка.Представление;
			Разделитель = ", ";
		КонецЕсли;
	КонецЦикла;
	ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию("СопоставлениеКолонок", КоличествоСопоставленных, СписокКолонокСопоставления);
	
	ЗначениеВРеквизитФормы(ТаблицаСопоставления, "ТаблицаСопоставленияДанных");
	
КонецПроцедуры

&НаСервере
Процедура ПоместитьДанныеВТаблицуСопоставления(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей)
	
	ТабличнаяЧасть = ПолучитьИзВременногоХранилища(АдресКопииТабличнойЧасти); // см. ОписаниеТабличнойЧасти 
	
	ЭтоТаблица = ТипЗнч(ТабличнаяЧасть) = Тип("ТаблицаЗначений");
	
	Если Не ЭтоТаблица Или ТабличнаяЧасть.Количество() = 0  Тогда
		Возврат;
	КонецЕсли;
	
	Отбор = Новый Структура("ОбязательнаДляЗаполнения", Истина);
	ОтобранныеКолонкиОбязательнаДляЗаполненияТаблицы = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
	КолонкиОбязательныеДляЗаполнения = Новый Соответствие;
	Для каждого КолонкаТаблицы Из ОтобранныеКолонкиОбязательнаДляЗаполненияТаблицы  Цикл
		КолонкиОбязательныеДляЗаполнения.Вставить(КолонкаТаблицы.Родитель, Истина);
	КонецЦикла;
	
	ТаблицаСопоставленияДанных.Очистить();
	ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных); // см. ОписаниеТабличнойЧасти 
	
	КолонкиТабличнойЧасти = Новый Соответствие();
	Для каждого Колонка Из ТабличнаяЧасть.Колонки Цикл
		КолонкиТабличнойЧасти.Вставить(Колонка.Имя, Истина);
	КонецЦикла;
	ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_";
	
	ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"); // см. Обработка.ЗагрузкаДанныхИзФайла.Форма.ЗагрузкаДанныхИзФайла.ТаблицаСопоставленияДанных
	Для каждого Строка Из ТабличнаяЧасть Цикл
		НоваяСтрока = ВременнаяТЗ.Добавить();
		НоваяСтрока.Идентификатор = Строка.Идентификатор;
		ЗаполненыВсеОбязательныеКолонки = Истина;
		Для каждого Колонка Из ТабличнаяЧасть.Колонки Цикл
			Если Колонка.Имя <> "Идентификатор" Тогда
				НоваяСтрока[ПрефиксТабличнойЧасти + Колонка.Имя] = Строка[Колонка.Имя];
			КонецЕсли;
			
			Если ЗначениеЗаполнено(КолонкиОбязательныеДляЗаполнения.Получить(Колонка.Имя))
				И ЗаполненыВсеОбязательныеКолонки
				И НЕ ЗначениеЗаполнено(Строка[Колонка.Имя]) Тогда
					ЗаполненыВсеОбязательныеКолонки = Ложь;
			КонецЕсли;
		КонецЦикла;
		
		НоваяСтрока["РезультатСопоставленияСтроки"] = ?(ЗаполненыВсеОбязательныеКолонки, 
			ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен(), ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен());
		
		Отбор = Новый Структура("Идентификатор", Строка.Идентификатор); 
		
		Неоднозначности = СписокНеоднозначностей.НайтиСтроки(Отбор);
		Если Неоднозначности.Количество() > 0 Тогда 
			НоваяСтрока["РезультатСопоставленияСтроки"] = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеоднозначность();
			Для каждого Неоднозначность Из Неоднозначности Цикл
				НоваяСтрока["ОписаниеОшибки"] = НоваяСтрока["ОписаниеОшибки"] + Неоднозначность.Колонка+ ";";
				ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
				ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
				ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПрефиксТабличнойЧасти + Неоднозначность.Колонка);
				ПолеОформления.Использование = Истина;
				ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
				ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаСопоставленияДанных.ОписаниеОшибки"); 
				ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит; 
				ЭлементОтбора.ПравоеЗначение = Неоднозначность.Колонка; 
				ЭлементОтбора.Использование = Истина;
				ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийОшибкуТекст);
				ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
				ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<неоднозначность>'"));
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	ВременнаяТЗ.Индексы.Добавить("Идентификатор");
	Для каждого Строка Из ЗагружаемыеДанные Цикл
		Отбор = Новый Структура("Идентификатор", Строка.Идентификатор);
		Строки = ВременнаяТЗ.НайтиСтроки(Отбор);
		Если Строки.Количество() > 0 Тогда 
			НоваяСтрока = Строки[0];
			Для каждого Колонка Из ЗагружаемыеДанные.Колонки Цикл
				Если Колонка.Имя <> "Идентификатор" И Колонка.Имя <> "РезультатСопоставленияСтроки" И Колонка.Имя <> "ОписаниеОшибки" Тогда
					НоваяСтрока["ФЛ_" + Колонка.Имя] = Строка[Колонка.Имя];
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	ЗначениеВДанныеФормы(ВременнаяТЗ, ТаблицаСопоставленияДанных);
	
КонецПроцедуры

&НаСервере
Функция АдресВХранилищеТаблицыСопоставления()
	Таблица = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	
	ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_";
	ТаблицаДляТЧ = Новый ТаблицаЗначений;
	Для Каждого Колонка Из Таблица.Колонки Цикл
		Если СтрНачинаетсяС(Колонка.Имя, ПрефиксТабличнойЧасти) Тогда
			ТаблицаДляТЧ.Колонки.Добавить(Сред(Колонка.Имя, СтрДлина(ПрефиксТабличнойЧасти) + 1), Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина);
		ИначеЕсли  Колонка.Имя = "РезультатСопоставленияСтроки" ИЛИ Колонка.Имя = "ОписаниеОшибки" ИЛИ Колонка.Имя = "Идентификатор" Тогда 
			ТаблицаДляТЧ.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Строка Из Таблица Цикл
		НоваяСтрока = ТаблицаДляТЧ.Добавить();
		Для Каждого Колонка Из ТаблицаДляТЧ.Колонки Цикл
			Если Колонка.Имя = "Идентификатор" Тогда 
				НоваяСтрока[Колонка.Имя] = Строка[Колонка.Имя];
			ИначеЕсли Колонка.Имя <> "РезультатСопоставленияСтроки" И Колонка.Имя <> "ОписаниеОшибки" Тогда
				НоваяСтрока[Колонка.Имя] = Строка[ПрефиксТабличнойЧасти + Колонка.Имя];
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат ПоместитьВоВременноеХранилище(ТаблицаДляТЧ);
КонецФункции

&НаСервереБезКонтекста
Функция МенеджерОбъекта(ИмяОбъектаСопоставления)
	
	МассивОбъекта = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ИмяОбъектаСопоставления);
	Если МассивОбъекта.ТипОбъекта = "Документ" Тогда
		МенеджерОбъекта = Документы[МассивОбъекта.НазваниеОбъекта];
	ИначеЕсли МассивОбъекта.ТипОбъекта = "Справочник" Тогда
		МенеджерОбъекта = Справочники[МассивОбъекта.НазваниеОбъекта];
	ИначеЕсли МассивОбъекта.ТипОбъекта = "Обработка" Тогда
		МенеджерОбъекта = Обработки[МассивОбъекта.НазваниеОбъекта];
	Иначе
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Объект ""%1"" не найден'"), ИмяОбъектаСопоставления);
	КонецЕсли;
	
	Возврат МенеджерОбъекта;
	
КонецФункции

&НаСервереБезКонтекста
Функция ФормаСписка(ИмяОбъектаСопоставления)
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления);
	Если ОбъектМетаданных.ОсновнаяФормаСписка <> Неопределено Тогда
		Возврат ОбъектМетаданных.ОсновнаяФормаСписка.ПолноеИмя();
	Иначе
		Возврат ОбъектМетаданных.ПолноеИмя() + ".ФормаСписка";
	КонецЕсли;
КонецФункции

&НаСервере
Функция ОписаниеТипаПоМетаданным(ПолноеИмяОбъектаМетаданных)
	Результат = Обработки.ЗагрузкаДанныхИзФайла.РазложитьПолноеИмяОбъекта(ПолноеИмяОбъектаМетаданных);
	Если Результат.ТипОбъекта = "Справочник" Тогда 
		Возврат Новый ОписаниеТипов("СправочникСсылка." +  Результат.НазваниеОбъекта);
	ИначеЕсли Результат.ТипОбъекта = "Документ" Тогда 
		Возврат Новый ОписаниеТипов("ДокументСсылка." +  Результат.НазваниеОбъекта);
	КонецЕсли;
	
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция НезаполненныеОбязательныеКолонки()
	НазванияКолонокБезДанных = Новый Массив;
	
	Отбор = Новый Структура("ОбязательнаДляЗаполнения", Истина);
	
	Шапка = ОбластьЗаголовкаШаблонаТаблицы(ШаблонСДанными);
	Для НомерКолонки = 1 По Шапка.ШиринаТаблицы Цикл 
		Ячейка = Шапка.ПолучитьОбласть(1, НомерКолонки, 1, НомерКолонки);
		ИмяКолонки = СокрЛП(Ячейка.ТекущаяОбласть.Текст);
		
		ИнформацияОКолонке = Неопределено;
		Отбор = Новый Структура("ПредставлениеКолонки", ИмяКолонки);
		КолонкиОтбор = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
		
		Если КолонкиОтбор.Количество() > 0 Тогда
			ИнформацияОКолонке = КолонкиОтбор[0];
		Иначе
			Отбор = Новый Структура("ИмяКолонки", ИмяКолонки);
			КолонкиОтбор = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
			
			Если КолонкиОтбор.Количество() > 0 Тогда
				ИнформацияОКолонке = КолонкиОтбор[0];
			КонецЕсли;
		КонецЕсли;
		Если ИнформацияОКолонке <> Неопределено Тогда
			Если ИнформацияОКолонке.ОбязательнаДляЗаполнения Тогда
				Для НомерСтроки = 2 По ШаблонСДанными.ВысотаТаблицы Цикл
					Ячейка = ШаблонСДанными.ПолучитьОбласть(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
					Если НЕ ЗначениеЗаполнено(Ячейка.ТекущаяОбласть.Текст) Тогда
						НазванияКолонокБезДанных.Добавить(ИнформацияОКолонке.ПредставлениеКолонки);
						Прервать;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат НазванияКолонокБезДанных;
КонецФункции

#Область ВнешняяЗагрузка

&НаСервере
Процедура СопоставитьДанныеВнешняяОбработка(ТаблицаСопоставленияДанныхСервер )
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
		МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
		ВнешнийОбъект = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВнешняяОбработкаСсылка);
		ВнешнийОбъект.СопоставитьЗагружаемыеДанныеИзФайла(ИдентификаторКоманды, ТаблицаСопоставленияДанныхСервер);
		
		Для каждого Строка Из ТаблицаСопоставленияДанныхСервер Цикл
			Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда
				Строка.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусСопоставлен();
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаписатьСопоставленныеДанныеВнешняяОбработка(СопоставленныеДанные) 
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
		МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
		ВнешнийОбъект = МодульДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВнешняяОбработкаСсылка);
	КонецЕсли;
	
	Отказ = Ложь;
	
	ПараметрыЗагрузки= ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных();
	ПараметрыЗагрузки.СоздаватьНовые = СоздаватьЕслиНеСопоставлено;
	ПараметрыЗагрузки.ОбновлятьСуществующие = ОбновлятьСуществующие;
	
	ВнешнийОбъект.ЗагрузитьИзФайла(ИдентификаторКоманды, СопоставленныеДанные, ПараметрыЗагрузки, Отказ); 
	
КонецПроцедуры

#КонецОбласти

#Область ЗагрузкаИзФайла

&НаСервере
Процедура ЗаписатьСопоставленныеДанныеПрикладнаяЗагрузка(СопоставленныеДанные)
	
	МенеджерОбъекта = МенеджерОбъекта(ИмяОбъектаСопоставления);
	
	Отказ = Ложь;
	
	ПараметрыЗагрузки= ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных();
	ПараметрыЗагрузки.СоздаватьНовые = СоздаватьЕслиНеСопоставлено;
	ПараметрыЗагрузки.ОбновлятьСуществующие = ОбновлятьСуществующие;
	
	МенеджерОбъекта.ЗагрузитьИзФайла(СопоставленныеДанные, ПараметрыЗагрузки, Отказ)
	
КонецПроцедуры

#КонецОбласти

#Область ЗагрузкаВТабличнуюЧасть

&НаСервере
Процедура СкопироватьСтруктуруТабличнойЧасти(АдресТабличнойЧасти)
	
	ДанныеДляТабличнойЧасти = ОписаниеТабличнойЧасти();
	
	Если ЗначениеЗаполнено(ИмяОбъектаСопоставления) Тогда
		ТабличнаяЧасть = Метаданные.НайтиПоПолномуИмени(ИмяОбъектаСопоставления);
	
		Для каждого РеквизитТабличнойЧасти Из ТабличнаяЧасть.Реквизиты Цикл
			ДанныеДляТабличнойЧасти.Колонки.Добавить(РеквизитТабличнойЧасти.Имя, РеквизитТабличнойЧасти.Тип, РеквизитТабличнойЧасти.Представление());
		КонецЦикла;
	Иначе
		Для каждого Колонка Из ИнформацияПоКолонкам Цикл
			ДанныеДляТабличнойЧасти.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки, Колонка.ПредставлениеКолонки);
		КонецЦикла;
	КонецЕсли;
	
	
	АдресТабличнойЧасти = ПоместитьВоВременноеХранилище(ДанныеДляТабличнойЧасти);
	
КонецПроцедуры

// Возвращаемое значение:
//   ТаблицаЗначений:
//   * Идентификатор - Число
//
&НаСервере
Функция ОписаниеТабличнойЧасти() 
	
	ДанныеДляТабличнойЧасти = Новый ТаблицаЗначений;
	ДанныеДляТабличнойЧасти.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Число"), "Идентификатор");
	
	Возврат ДанныеДляТабличнойЧасти;
	
КонецФункции

#КонецОбласти

&НаСервере
Функция ОбластьЗаголовкаШаблонаТаблицы(Шаблон)
	МетаданныеОбластьЗаголовокТаблицы = Шаблон.Области.Найти("Шапка");
	
	Если МетаданныеОбластьЗаголовокТаблицы = Неопределено Тогда 
		ОбластьЗаголовокТаблицы = Шаблон.ПолучитьОбласть("R1");
	Иначе 
		ОбластьЗаголовокТаблицы = Шаблон.ПолучитьОбласть("Шапка"); 
	КонецЕсли;
	
	Возврат ОбластьЗаголовокТаблицы;
	
КонецФункции

&НаСервере
Процедура ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки()
	
	Если Элементы.СтраницыЗаполненияДанных.ТекущаяСтраница = Элементы.СтраницаВариантЗагрузкаИзФайла Тогда
		ТекстПодсказки = НСтр("ru = 'Для загрузки данных необходимо, сохранить бланк в файл для заполнения в другой программе. 
		|Затем загрузить заполненную таблицу в одном из форматов:
		|• Книги Microsoft Excel 97 (.xls) и Excel 2007 (.xlsx)
		|• Электронные таблицы LibreOffice Calc (.ods)
		|• Текст с разделителями (.csv)
		|• Табличный документ (.mxl)'") + Символы.ПС;
	Иначе
		ТекстПодсказки = НСтр("ru = 'Для заполнения таблицы скопируйте данные в таблицу из внешнего файла через буфер обмена.'") + Символы.ПС;
	КонецЕсли;
	
	Отбор = Новый Структура("ОбязательнаДляЗаполнения", Истина);
	ОбязательныеКолонки= ИнформацияПоКолонкам.НайтиСтроки(Отбор);
	
	Если ОбязательныеКолонки.Количество() > 0 Тогда 
		СписокКолонок = "";
		
		Для каждого Колонка Из ОбязательныеКолонки Цикл 
			Если ЗначениеЗаполнено(Колонка.Синоним) Тогда
				СписокКолонок = СписокКолонок + ", """ + Колонка.Синоним + """";
			Иначе
				СписокКолонок = СписокКолонок + ", """ + Колонка.ПредставлениеКолонки + """";
			КонецЕсли;
		КонецЦикла;
		СписокКолонок = Сред(СписокКолонок, 3);
		
		Если ОбязательныеКолонки.Количество() = 1 Тогда
			ТекстПодсказки = ТекстПодсказки + НСтр("ru = 'Колонка, обязательная для заполнения:'") + " " + СписокКолонок;
		Иначе
			ТекстПодсказки = ТекстПодсказки + НСтр("ru = 'Колонки, обязательные для заполнения:'") + " " + СписокКолонок;
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.НадписьПодсказкаДляЗаполнения.Заголовок = ТекстПодсказки;
	Элементы.ПояснениеВариантЗагрузкаИзФайла.Заголовок = ТекстПодсказки;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, СтруктураОбъектаСопоставления, ДобавитьИдентификатор,
		ДобавитьОписаниеОшибки, ДобавитьРезультатСопоставленияСтроки, ДобавитьСписокНеоднозначностей)
		
	Если ДобавитьИдентификатор Тогда 
		ВременнаяТЗ.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Число"), НСтр("ru = 'п/п'"));
	КонецЕсли;
	
	Если ЗначениеЗаполнено(СтруктураОбъектаСопоставления) Тогда 
		Если Не ЗначениеЗаполнено(СтруктураОбъектаСопоставления.Синоним) Тогда
			ЗаголовокКолонки = "";
			Если СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления.Типы().Количество() > 1 Тогда 
				ЗаголовокКолонки = НСтр("ru = 'Объекты'");
			Иначе
				ЗаголовокКолонки = Строка(СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления.Типы()[0]);
			КонецЕсли;
			
		Иначе
			ЗаголовокКолонки = СтруктураОбъектаСопоставления.Синоним;
		КонецЕсли;
		ВременнаяТЗ.Колонки.Добавить("ОбъектСопоставления", СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления, ЗаголовокКолонки);
	КонецЕсли;
	
	Если ДобавитьРезультатСопоставленияСтроки Тогда 
		ВременнаяТЗ.Колонки.Добавить("РезультатСопоставленияСтроки", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Результат'"));
	КонецЕсли;
	Если ДобавитьОписаниеОшибки Тогда
		ВременнаяТЗ.Колонки.Добавить("ОписаниеОшибки", Новый ОписаниеТипов("Строка"), НСтр("ru = 'Причина'"));
	КонецЕсли;

	Если ДобавитьСписокНеоднозначностей Тогда 
		ТипСЗ = Новый ОписаниеТипов("СписокЗначений");
		ВременнаяТЗ.Колонки.Добавить("СписокНеоднозначностей", ТипСЗ, "СписокНеоднозначностей");
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления , ДобавитьИдентификатор, 
		ДобавитьОписаниеОшибки, ДобавитьРезультатСопоставленияСтроки, ДобавитьСписокНеоднозначностей)
		
		ТипСтрока = Новый ОписаниеТипов("Строка");
		Если ДобавитьИдентификатор Тогда 
			ТипЧисло = Новый ОписаниеТипов("Число");
			МассивРеквизитов.Добавить(Новый РеквизитФормы("Идентификатор", ТипЧисло, "ТаблицаСопоставленияДанных", "Идентификатор"));
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ОписаниеТипаОбъектаСопоставления) Тогда 
			МассивРеквизитов.Добавить(Новый РеквизитФормы("ОбъектСопоставления", ОписаниеТипаОбъектаСопоставления, "ТаблицаСопоставленияДанных", ИмяОбъектаСопоставления));
		КонецЕсли;
		
		Если ДобавитьРезультатСопоставленияСтроки Тогда
			МассивРеквизитов.Добавить(Новый РеквизитФормы("РезультатСопоставленияСтроки", ТипСтрока, "ТаблицаСопоставленияДанных", "Результат"));
		КонецЕсли;
		Если ДобавитьОписаниеОшибки Тогда 
			МассивРеквизитов.Добавить(Новый РеквизитФормы("ОписаниеОшибки", ТипСтрока, "ТаблицаСопоставленияДанных", "Причина"));
		КонецЕсли;

	Если ДобавитьСписокНеоднозначностей Тогда 
		ТипСЗ = Новый ОписаниеТипов("СписокЗначений");
		МассивРеквизитов.Добавить(Новый РеквизитФормы("СписокНеоднозначностей", ТипСЗ, "ТаблицаСопоставленияДанных", "СписокНеоднозначностей"));
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура СоздатьТаблицуСопоставленияПоИнформацииОКолонкахАвто(ОписаниеТипаОбъектаСопоставления)
	
	МассивРеквизитов = Новый Массив;
	
	ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	ВременнаяТЗ.Колонки.Очистить();
	
	СтруктураОбъектаСопоставления = ОписаниеОбъектаСопоставления();
	СтруктураОбъектаСопоставления.ОписаниеТипаОбъектаСопоставления = ОписаниеТипаОбъектаСопоставления;
	
	ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, СтруктураОбъектаСопоставления, Истина, Ложь, Истина, Истина);
	ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления, Истина, Ложь, Истина, Истина);
	
	Для каждого Колонка Из ИнформацияПоКолонкам Цикл
		ВременнаяТЗ.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки, Колонка.ПредставлениеКолонки);
		МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.ИмяКолонки, Колонка.ТипКолонки, "ТаблицаСопоставленияДанных", Колонка.ПредставлениеКолонки));
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивРеквизитов);
	
	ЗначениеВРеквизитФормы(ВременнаяТЗ, "ТаблицаСопоставленияДанных");
	
	Картинка = БиблиотекаКартинок.Изменить;
	Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл
		НовыйЭлемент = Элементы.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2",
			ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТаблицыСопоставления(), Колонка.Имя),
			Тип("ПолеФормы"), Элементы.ТаблицаСопоставленияДанных); // РасширениеПоляФормыДляПоляВвода
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.ПутьКДанным = "ТаблицаСопоставленияДанных." + Колонка.Имя;
		НовыйЭлемент.Заголовок = Колонка.Заголовок;
		НовыйЭлемент.ТолькоПросмотр = Истина;
		Если НовыйЭлемент.Вид <> ВидПоляФормы.ПолеНадписи Тогда
			ОбязательнаДляЗаполнения = ЭтаКолонкаОбязательнаДляЗаполнения(Колонка.Имя);
			НовыйЭлемент.АвтоОтметкаНезаполненного  = ОбязательнаДляЗаполнения;
			НовыйЭлемент.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
			
		КонецЕсли;
		Если Колонка.Имя = "ОбъектСопоставления" Тогда
			НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
			НовыйЭлемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля;
			НовыйЭлемент.КартинкаШапки = Картинка;
			НовыйЭлемент.ТолькоПросмотр = Ложь;
			
			НовыйЭлемент.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
			НовыйЭлемент.КнопкаСоздания = Ложь;
			НовыйЭлемент.КнопкаОткрытия = Истина;
			НовыйЭлемент.КнопкаВыбора = Истина;
			НовыйЭлемент.РедактированиеТекста = Истина;
			НовыйЭлемент.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
		ИначеЕсли Колонка.Имя = "Идентификатор" Тогда
			НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
			НовыйЭлемент.ТолькоПросмотр = Истина;
			НовыйЭлемент.Ширина = 4;
		ИначеЕсли Колонка.Имя = "РезультатСопоставленияСтроки" ИЛИ Колонка.Имя = "СписокНеоднозначностей" Тогда
			НовыйЭлемент.Видимость = Ложь;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

// Возвращаемое значение:
//  Структура:
//   * ОписаниеТипаОбъектаСопоставления - Строка
//   * Синоним - Строка
//
&НаСервереБезКонтекста
Функция ОписаниеОбъектаСопоставления()
	
	СтруктураОбъектаСопоставления = Новый Структура;
	СтруктураОбъектаСопоставления.Вставить("ОписаниеТипаОбъектаСопоставления", "");
	СтруктураОбъектаСопоставления.Вставить("Синоним", "");
	
	Возврат СтруктураОбъектаСопоставления;
	
КонецФункции

&НаСервере
Процедура СоздатьТаблицуСопоставленияПоИнформацииОКолонках()
	
	МассивРеквизитов = Новый Массив;
	
	ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления);
	ОписаниеТипаОбъектаСопоставления = ОписаниеТипаПоМетаданным(ИмяОбъектаСопоставления);
	
	ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	ВременнаяТЗ.Колонки.Очистить();
	
	Синоним = ?(ЗначениеЗаполнено(ПараметрыЗагрузки.ПредставлениеОбъекта), 
		ПараметрыЗагрузки.ПредставлениеОбъекта, ОбъектМетаданных.Представление());
	
	ВременнаяТЗ  = ЗагрузкаДанныхИзФайла.ОписаниеЗагружаемыхДанныхДляСправочников(ВременнаяТЗ, ОписаниеТипаОбъектаСопоставления, Синоним);
	ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, ОписаниеТипаОбъектаСопоставления, Истина, Истина, Истина, Истина);
	
	Для каждого Колонка Из ИнформацияПоКолонкам Цикл 
		Если ВременнаяТЗ.Колонки.Найти(Колонка.ИмяКолонки) = Неопределено Тогда
			ПредставлениеКолонки = Колонка.ПредставлениеКолонки;
			ВременнаяТЗ.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки, ПредставлениеКолонки);
			МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.ИмяКолонки, Колонка.ТипКолонки, "ТаблицаСопоставленияДанных", ПредставлениеКолонки));
		КонецЕсли;
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивРеквизитов);
	
	Картинка = БиблиотекаКартинок.Изменить;
	Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл
		НовыйЭлемент = Элементы.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2",
			ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТаблицыСопоставления(), Колонка.Имя),
			Тип("ПолеФормы"), Элементы.ТаблицаСопоставленияДанных); // РасширениеПоляФормыДляПоляВвода
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.ПутьКДанным = "ТаблицаСопоставленияДанных." + Колонка.Имя;
		НовыйЭлемент.Заголовок = Колонка.Заголовок;
		НовыйЭлемент.ТолькоПросмотр = Истина;
		Если НовыйЭлемент.Вид <> ВидПоляФормы.ПолеНадписи Тогда 
			ОбязательнаДляЗаполнения = ЭтаКолонкаОбязательнаДляЗаполнения(Колонка.Имя);
			НовыйЭлемент.АвтоОтметкаНезаполненного  = ОбязательнаДляЗаполнения;
			НовыйЭлемент.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
		КонецЕсли;
		Если Колонка.Имя = "ОбъектСопоставления" Тогда 
			НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
			НовыйЭлемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля;
			НовыйЭлемент.КартинкаШапки = Картинка;
			НовыйЭлемент.ТолькоПросмотр = Ложь;
			НовыйЭлемент.РежимРедактирования =  РежимРедактированияКолонки.Непосредственно;
			НовыйЭлемент.РежимВыбораНезаполненного = РежимВыбораНезаполненного.ПриАктивизации;
		ИначеЕсли Колонка.Имя = "Идентификатор" Тогда
			НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
			НовыйЭлемент.ТолькоПросмотр = Истина;
			НовыйЭлемент.Ширина = 4;
		ИначеЕсли Колонка.Имя = "РезультатСопоставленияСтроки" ИЛИ Колонка.Имя = "ОписаниеОшибки" ИЛИ Колонка.Имя = "СписокНеоднозначностей" Тогда
			НовыйЭлемент.Видимость = Ложь;
		КонецЕсли;
		
		Отбор = Новый Структура("ИмяКолонки", Колонка.Имя);
		Колонки = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
		Если Колонки.Количество() > 0 Тогда 
			НовыйЭлемент.Видимость = Колонки[0].Видимость;
		КонецЕсли;
		
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ВременнаяТЗ, "ТаблицаСопоставленияДанных");
КонецПроцедуры

&НаСервере
Процедура СоздатьТаблицуСопоставленияПоИнформацииОКолонкахДляТЧ() 
	
	МассивРеквизитов = Новый Массив;
	ТипСтрока = Новый ОписаниеТипов("Строка");
	
	ВременнаяТЗ = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"); 
	ВременнаяТЗ.Колонки.Очистить();
	
	ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, Неопределено, Истина, Истина, Истина, Ложь);
	ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, Неопределено, Истина, Истина, Истина, Ложь);
	
	ОбязательныеКолонки = Новый Массив;
	КолонкиСодержащиеСвязиПараметровВыбора = Новый Соответствие;
	ОбъектРеквизитыТЧ = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаСопоставления); // ОбъектМетаданныхСправочник,  ОбъектМетаданныхДокумент
	РеквизитыТЧ = ОбъектРеквизитыТЧ.Реквизиты;
	ПрефиксТабличнойЧасти = ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТабличнойЧасти() + "_";
	
	Для каждого Колонка Из РеквизитыТЧ Цикл
		
		Если Колонка.Тип.СодержитТип(Тип("ХранилищеЗначения")) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Колонка.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку Тогда
			ОбязательныеКолонки.Добавить(ПрефиксТабличнойЧасти + Колонка.Имя);
		КонецЕсли;
		
		Если Колонка.СвязиПараметровВыбора.Количество() > 0 Тогда
			КолонкиСодержащиеСвязиПараметровВыбора.Вставить(Колонка.Имя, Колонка.СвязиПараметровВыбора);
		КонецЕсли;
		
		ТипРеквизита = ?(Колонка.Тип.СодержитТип(Тип("УникальныйИдентификатор")), ОбщегоНазначения.ОписаниеТипаСтрока(36), Колонка.Тип);
		
		ВременнаяТЗ.Колонки.Добавить(ПрефиксТабличнойЧасти + Колонка.Имя, ТипРеквизита, Колонка.Представление());
		МассивРеквизитов.Добавить(Новый РеквизитФормы(ПрефиксТабличнойЧасти + Колонка.Имя, ТипРеквизита, "ТаблицаСопоставленияДанных", Колонка.Представление()));
		
	КонецЦикла;
	
	Для каждого Колонка Из ИнформацияПоКолонкам Цикл
		ВременнаяТЗ.Колонки.Добавить("ФЛ_" + Колонка.ИмяКолонки, ТипСтрока, Колонка.ПредставлениеКолонки);
		МассивРеквизитов.Добавить(Новый РеквизитФормы("ФЛ_" + Колонка.ИмяКолонки, ТипСтрока, "ТаблицаСопоставленияДанных", Колонка.ПредставлениеКолонки));
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивРеквизитов);
	РеквизитыСозданы = Истина;
	
	ГруппаКолонокЗагружаемыеДанные = Элементы.Добавить("ЗагружаемыеДанные", Тип("ГруппаФормы"), Элементы.ТаблицаСопоставленияДанных);
	ГруппаКолонокЗагружаемыеДанные.Группировка = ГруппировкаКолонок.Горизонтальная;
	Картинка = БиблиотекаКартинок.Изменить;
	
	Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл
		
		Если СтрНачинаетсяС(Колонка.Имя, ПрефиксТабличнойЧасти) Тогда
			ГруппаКолонокЗагружаемыеДанныеТЧ = Элементы.Добавить("ЗагружаемыеДанные_" + Колонка.Имя , Тип("ГруппаФормы"), ГруппаКолонокЗагружаемыеДанные);
			ГруппаКолонокЗагружаемыеДанныеТЧ.Группировка = ГруппировкаКолонок.Вертикальная;
			Родитель = ГруппаКолонокЗагружаемыеДанныеТЧ;
		ИначеЕсли СтрНачинаетсяС(Колонка.Имя, "ФЛ_") Тогда
			Продолжить;
		Иначе
			Родитель = ГруппаКолонокЗагружаемыеДанные;
		КонецЕсли;
		
		НовыйЭлемент = Элементы.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1_%2",
			ЗагрузкаДанныхИзФайлаКлиентСервер.ПрефиксТаблицыСопоставления(), Колонка.Имя), Тип("ПолеФормы"), Родитель);
		
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.ПутьКДанным = "ТаблицаСопоставленияДанных." + Колонка.Имя;
		НовыйЭлемент.Заголовок = Колонка.Заголовок;
		НовыйЭлемент.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
		
		Если СтрДлина(Колонка.Имя) > 3 И СтрНачинаетсяС(Колонка.Имя, ПрефиксТабличнойЧасти) Тогда
			Отбор = Новый Структура("ИмяКолонки", Сред(Колонка.Имя, 4));
			Колонки = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
			Если Колонки.Количество() > 0 Тогда 
				НовыйЭлемент.Видимость = Колонки[0].Видимость;
			КонецЕсли;
		КонецЕсли;
		
		Если Колонка.Имя = "Идентификатор" Тогда
			НовыйЭлемент.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
			НовыйЭлемент.ТолькоПросмотр = Истина;
			НовыйЭлемент.Ширина = 1;
		ИначеЕсли Колонка.Имя = "РезультатСопоставленияСтроки" ИЛИ Колонка.Имя = "ОписаниеОшибки" Тогда
			НовыйЭлемент.Видимость = Ложь;
		КонецЕсли;
		
		Если ОбязательныеКолонки.Найти(Колонка.Имя) <> Неопределено Тогда 
			НовыйЭлемент.АвтоОтметкаНезаполненного = Истина;
		КонецЕсли;
		
		Если СтрНачинаетсяС(Колонка.Имя, ПрефиксТабличнойЧасти) Тогда
			ТипКолонки = Метаданные.НайтиПоТипу(Колонка.ТипЗначения.Типы()[0]);
			Если ТипКолонки <> Неопределено И СтрНайти(ТипКолонки.ПолноеИмя(), "Справочник") > 0 Тогда
				НовыйЭлемент.КартинкаШапки = Картинка;
			КонецЕсли;
			
			КолонкаСвязьПараметровВыбора = КолонкиСодержащиеСвязиПараметровВыбора.Получить(Сред(Колонка.Имя, 4));
			Если КолонкаСвязьПараметровВыбора <> Неопределено Тогда 
				НовыйМассив = Новый Массив();
				Для каждого СвязьПараметраВыбора Из КолонкаСвязьПараметровВыбора Цикл // СвязьПараметраВыбора
					Позиция = СтрНайти(СвязьПараметраВыбора.ПутьКДанным, ".", НаправлениеПоиска.СКонца);
					Если Позиция > 0 Тогда
						ИмяЭлемента = Сред(СвязьПараметраВыбора.ПутьКДанным, Позиция + 1);
						НоваяСвязь = Новый СвязьПараметраВыбора(СвязьПараметраВыбора.Имя, "Элементы.ТаблицаСопоставленияДанных.ТекущиеДанные." 
							+ ПрефиксТабличнойЧасти + ИмяЭлемента, СвязьПараметраВыбора.ИзменениеЗначения);
						НовыйМассив.Добавить(НоваяСвязь);
					КонецЕсли;
				КонецЦикла;
				НовыеСвязи = Новый ФиксированныйМассив(НовыйМассив);
				НовыйЭлемент.СвязиПараметровВыбора = НовыеСвязи;
			КонецЕсли;
			
			Отбор = Новый Структура("Родитель", Сред(Колонка.Имя, 4));
			КолонкиГруппировки = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
			
			Если КолонкиГруппировки.Количество() = 1 Тогда
				
				КолонкаУровень2 = ВременнаяТЗ.Колонки.Найти("ФЛ_" + КолонкиГруппировки[0].ИмяКолонки);
				Если КолонкаУровень2 <> Неопределено Тогда 
					НовыйЭлемент = Элементы.Добавить(КолонкаУровень2.Имя, Тип("ПолеФормы"), Родитель); // РасширениеПоляФормыДляПоляВвода
					НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
					НовыйЭлемент.ПутьКДанным = "ТаблицаСопоставленияДанных." + КолонкаУровень2.Имя;
					ТипКолонки = Метаданные.НайтиПоТипу(КолонкаУровень2.ТипЗначения.Типы()[0]);
					Если ТипКолонки <> Неопределено И СтрНайти(ТипКолонки.ПолноеИмя(), "Справочник") > 0 Тогда
						НовыйЭлемент.Заголовок = НСтр("ru = 'Данные из файла'");
					Иначе
						НовыйЭлемент.Заголовок = " ";
					КонецЕсли;
					НовыйЭлемент.ТолькоПросмотр = Истина;
					НовыйЭлемент.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
				КонецЕсли;
				
			ИначеЕсли КолонкиГруппировки.Количество() > 1 Тогда
				ГруппаКолонокЗагружаемыеДанныеТЧ = Элементы.Добавить("ЗагружаемыеДанные_ФЛ_" + Колонка.Имя , Тип("ГруппаФормы"), Родитель);
				ГруппаКолонокЗагружаемыеДанныеТЧ.Группировка = ГруппировкаКолонок.ВЯчейке;
				Родитель = ГруппаКолонокЗагружаемыеДанныеТЧ;
				
				Префикс = НСтр("ru = 'Данные из файла:'");
				Для каждого КолонкаГруппа Из КолонкиГруппировки Цикл
					Колонка2 = ВременнаяТЗ.Колонки.Найти("ФЛ_" + КолонкаГруппа.ИмяКолонки);
					Если Колонка2 <> Неопределено Тогда 
						НовыйЭлемент = Элементы.Добавить(Колонка2.Имя, Тип("ПолеФормы"), Родитель);  // РасширениеПоляФормыДляПоляВвода
						НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
						НовыйЭлемент.ПутьКДанным = "ТаблицаСопоставленияДанных." + Колонка2.Имя;
						НовыйЭлемент.Заголовок = Префикс + Колонка2.Заголовок;
						НовыйЭлемент.ТолькоПросмотр = Истина;
						НовыйЭлемент.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
						
						Если СтрДлина(Колонка.Имя) > 3 И СтрНачинаетсяС(Колонка.Имя, "ФЛ_") Тогда
						Отбор = Новый Структура("ИмяКолонки", Сред(Колонка.Имя, 4));
						Колонки = ИнформацияПоКолонкам.НайтиСтроки(Отбор);
							Если Колонки.Количество() > 0 Тогда 
								НовыйЭлемент.Видимость = Колонки[0].Видимость;
							КонецЕсли;
						КонецЕсли;
						
					КонецЕсли;
					Префикс = "";
				КонецЦикла;
			Иначе
				НовыйЭлемент.Видимость = Ложь;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ВременнаяТЗ, "ТаблицаСопоставленияДанных");
КонецПроцедуры

&НаСервере
Функция ЭтаКолонкаОбязательнаДляЗаполнения(ИмяКолонки)
	Отбор = Новый Структура("ИмяКолонки", ИмяКолонки);
	Колонка =  ИнформацияПоКолонкам.НайтиСтроки(Отбор);
	Если Колонка.Количество()>0 Тогда 
		Возврат Колонка[0].ОбязательнаДляЗаполнения;
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

&НаСервере
Процедура ОчисткаШаблонСДанными()
	НомерСтрокиСШапкойТаблицы = ?(ЗагрузкаДанныхИзФайлаКлиентСервер.КолонкиИмеютГруппировку(ИнформацияПоКолонкам), 2, 1);
	
	ОбластьЗаголовка = ШаблонСДанными.ПолучитьОбласть(1, 1, НомерСтрокиСШапкойТаблицы, ШаблонСДанными.ШиринаТаблицы);
	ШаблонСДанными.Очистить();
	ШаблонСДанными.Вывести(ОбластьЗаголовка);
КонецПроцедуры

&НаСервере
Функция ГрупповоеИзменениеРеквизитовНаСервере(ВерхняяПозиция, НижняяПозиция)
	МассивСсылок = Новый Массив;
	Для Позиция = ВерхняяПозиция По НижняяПозиция Цикл 
		Ячейка = ТаблицаОтчет.ПолучитьОбласть(Позиция, 2, Позиция, 2);	
		Если ЗначениеЗаполнено(Ячейка.ТекущаяОбласть.Расшифровка) Тогда 
			МассивСсылок.Добавить(Ячейка.ТекущаяОбласть.Расшифровка);
		КонецЕсли;
	КонецЦикла;
	Возврат МассивСсылок;
КонецФункции

////////////////////// Работа с файлами //////////////////////

&НаКлиенте
Процедура ПослеВыбораФайлаДляСохранения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		ПутьКФайлу = Результат[0];
		ВыбранныйФайл = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу);
		РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение);
	
		Если ЗначениеЗаполнено(ВыбранныйФайл.Имя) Тогда
			Если РасширениеФайла = "csv" Тогда
				СохранитьТаблицуВCSVФайл(ПутьКФайлу);
			Иначе
				Если РасширениеФайла = "xlsx" Тогда
					ТипФайла = ТипФайлаТабличногоДокумента.XLSX;
				ИначеЕсли РасширениеФайла = "mxl" Тогда
					ТипФайла = ТипФайлаТабличногоДокумента.MXL;
				ИначеЕсли РасширениеФайла = "xls" Тогда
					ТипФайла = ТипФайлаТабличногоДокумента.XLS;
				ИначеЕсли РасширениеФайла = "ods" Тогда
					ТипФайла = ТипФайлаТабличногоДокумента.ODS;
				Иначе
					ПоказатьПредупреждение(, НСтр("ru = 'Шаблон файла не был сохранен.'"));
					Возврат;
				КонецЕсли;
				Оповещение = Новый ОписаниеОповещения("ПослеЗаписиТабличногоДокументаВФайл", ЭтотОбъект);
				ШаблонСДанными.НачатьЗапись(Оповещение, ПутьКФайлу, ТипФайла);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписиТабличногоДокументаВФайл(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Ложь Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Шаблон файла не был сохранен.'"));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьДанныеИзФайлаВШаблон(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		ДоступностьКнопокКомандойПанели(Ложь);
		Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации;
		ИмяФайла                 = Результат.Имя;
		АдресВременногоХранилища = Результат.Хранение;
		Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла));
	
		ФоновоеЗадание = ЗагрузитьФайлСДаннымиВТабличныйДокументНаСервере(АдресВременногоХранилища, Расширение);
		НастройкиОжидания                                = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		НастройкиОжидания.ВыводитьОкноОжидания           = Ложь;
		НастройкиОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
		Обработчик = Новый ОписаниеОповещения("ПослеЗагрузкиФайлаСДаннымиВТабличныйДокумент", ЭтотОбъект);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораРасширенияФайла(Результат, Параметр) Экспорт
	Если ЗначениеЗаполнено(Результат) Тогда
		АдресВоВременномХранилище = УникальныйИдентификатор;
		СохранитьШаблонВоВременноеХранилище(Результат, АдресВоВременномХранилище);
		ПараметрыСохраненияФайла = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
		ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, АдресВоВременномХранилище,
			ИмяОбъектаСопоставления + "." + Результат, ПараметрыСохраненияФайла);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура СохранитьШаблонВоВременноеХранилище(РасширениеФайла, АдресВоВременномХранилище)
	
	ИмяФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
	Если РасширениеФайла = "csv" Тогда 
		СохранитьТаблицуВCSVФайл(ИмяФайла);
	ИначеЕсли РасширениеФайла = "xlsx" Тогда
		ШаблонСДанными.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
	ИначеЕсли РасширениеФайла = "xls" Тогда
		ШаблонСДанными.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
	ИначеЕсли РасширениеФайла = "ods" Тогда
		ШаблонСДанными.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.ODS);
	Иначе 
		ШаблонСДанными.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL);
	КонецЕсли;
	ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
	
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, АдресВоВременномХранилище);
	
	ФайловаяСистема.УдалитьВременныйФайл(ИмяФайла);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаМетаданных)
	МетаданныеСправочника = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъектаМетаданных);
	
	Если МетаданныеСправочника <> Неопределено Тогда 
		ИмяФайла = СокрЛП(МетаданныеСправочника.Синоним);
		Если СтрДлина(ИмяФайла) = 0 Тогда 
			ИмяФайла = ИмяОбъектаМетаданных;	
		КонецЕсли;
	Иначе
		ИмяФайла = ИмяОбъектаМетаданных;
	КонецЕсли;
	
	ИмяФайла = СтрЗаменить(ИмяФайла,":","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"*","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"\","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"/","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"&","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"<","");
	ИмяФайла = СтрЗаменить(ИмяФайла,">","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"|","");
	ИмяФайла = СтрЗаменить(ИмяФайла,"""","");
	
	Возврат ИмяФайла;
КонецФункции 

&НаКлиенте
Процедура ПослеВопросаПроОтменитьСопоставление(Результат, Параметр) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		Для каждого СтрокаТаблицы Из ТаблицаСопоставленияДанных Цикл
			СтрокаТаблицы.ОбъектСопоставления = Неопределено;
			СтрокаТаблицы.РезультатСопоставленияСтроки = ЗагрузкаДанныхИзФайлаКлиентСервер.СтатусНеСопоставлен();
			СтрокаТаблицы.СписокНеоднозначностей = Неопределено;
			СтрокаТаблицы.ОписаниеОшибки = "";
		КонецЦикла;
		ПоказатьСтатистикуПоСопоставлениюЗагрузкаИзФайла();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВызоваФормыИзменитьБланк(Результат, Параметр) Экспорт
	
	Если Результат <> Неопределено Тогда
		Если Результат.Количество() > 0 Тогда
			
			ИнформацияПоКолонкам.Очистить();
			Для Каждого СтрокаТаблицы Из Результат Цикл
				НоваяСтрока = ИнформацияПоКолонкам.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);
			КонецЦикла;
			СохранятьНастройки = Истина;
			
		Иначе
			ИнформацияПоКолонкам.Очистить();
			СформироватьМакетПоТипуЗагрузки();
			СохранятьНастройки = Ложь;
		КонецЕсли;
		ИнформацияПоКолонкам.Сортировать("Позиция Возр");
		ОбновитьНаименованияКолонокТаблицыСопоставления();
		ИзменитьБланкПоИнформацииПоКолонкам(, СохранятьНастройки);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьНаименованияКолонокТаблицыСопоставления()
	
	Для каждого СтрокаТаблицы Из ИнформацияПоКолонкам Цикл 
		Колонка = Элементы.ТаблицаСопоставленияДанных.ПодчиненныеЭлементы.Найти(СтрокаТаблицы.ИмяКолонки); // ПолеФормы
		Если Колонка <> Неопределено Тогда
			Колонка.Заголовок = ?(НЕ ПустаяСтрока(СтрокаТаблицы.Синоним), 
				СтрокаТаблицы.Синоним + " (" + СтрокаТаблицы.ПредставлениеКолонки +")", 
				СтрокаТаблицы.ПредставлениеКолонки);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ИзменитьБланкПоИнформацииПоКолонкам(Бланк = Неопределено, СохранитьНастройки = Ложь)

	Если Бланк = Неопределено Тогда 
		Бланк = ШаблонСДанными;
	КонецЕсли;
	
	ТаблицаКолонок = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
	Если СохранитьНастройки Тогда
		ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ЗагрузкаДанныхИзФайла", ИмяОбъектаСопоставления, ТаблицаКолонок,, ИмяПользователя());
	КонецЕсли;
	
	Бланк.Очистить();
	Шапка = Обработки.ЗагрузкаДанныхИзФайла.ШапкаБланкаДляЗаполненияПоИнформацииПоКолонкам(ТаблицаКолонок);
	Бланк.Вывести(Шапка);
	ПоказатьИнформационнуюСтрокуПроОбязательныеКолонки();
	
КонецПроцедуры

&НаКлиенте
Процедура ШаблонСДаннымиПриИзменении(Элемент)
	ПодтверждениеЗакрытияФормы = Ложь;
КонецПроцедуры

#Область ФоновыеЗадания

// Фоновая загрузка файла с данными

&НаСервере
Функция ЗагрузитьФайлСДаннымиВТабличныйДокументНаСервере(АдресВременногоХранилища, Расширение)
	
	ОбщийКаталогВременныхФайлов = ФайловаяСистема.ОбщийКаталогВременныхФайлов(); 
	
	ВременныйФайл = Новый Файл(ПолучитьИмяВременногоФайла(Расширение));
	ИмяВременногоФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщийКаталогВременныхФайлов + ВременныйФайл.Имя);
	
	ДвоичныеДанные = ПолучитьИЗВременногоХранилища(АдресВременногоХранилища); // ДвоичныеДанные
	ДвоичныеДанные.Записать(ИмяВременногоФайла);
	
	ОчисткаШаблонСДанными();
	
	ПараметрыВызоваСервера = Новый Структура();
	ПараметрыВызоваСервера.Вставить("Расширение", Расширение);
	ПараметрыВызоваСервера.Вставить("ШаблонСДанными", ШаблонСДанными);
	ПараметрыВызоваСервера.Вставить("ИмяВременногоФайла", ИмяВременногоФайла);
	ПараметрыВызоваСервера.Вставить("ИнформацияПоКолонкам", РеквизитФормыВЗначение("ИнформацияПоКолонкам"));
	
	ПараметрыВыполненияВФоне = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполненияВФоне.НаименованиеФоновогоЗадания =  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Подсистема %1: Выполнение серверного метода загрузка данных из файла'"), "ЗагрузкаДанныхИзФайла");
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаДанныхИзФайла.ЗагрузитьФайлВТаблицу",
		ПараметрыВызоваСервера, ПараметрыВыполненияВФоне);
	
	Возврат ФоновоеЗадание;
	
КонецФункции

&НаКлиенте
Процедура ПослеЗагрузкиФайлаСДаннымиВТабличныйДокумент(ФоновоеЗадание, ДополнительныеПараметры) Экспорт

	Если ФоновоеЗадание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ФоновоеЗадание.Статус = "Выполнено" Тогда
		ШаблонСДанными = ПолучитьИзВременногоХранилища(ФоновоеЗадание.АдресРезультата);
		СопоставитьЗагружаемыеДанные();
	Иначе
		ВывестиСообщениеОбОшибке(НСтр("ru = 'Не удалось произвести загрузку данных.'"), ФоновоеЗадание.КраткоеПредставлениеОшибки);
	КонецЕсли;

КонецПроцедуры

// Фоновое сопоставление загруженных данных

&НаСервере
Функция СопоставитьЗагружаемыеДанныеНаСервереУниверсальнаяЗагрузка()
	
	ЗагрузкаДанныхИзФайла.ДобавитьСтатистическуюИнформацию(?(ВариантЗагрузки = 0,
		"ВариантЗагрузки.ЗаполнениеТаблицы", "ВариантЗагрузки.ИзВнешнегоФайла"));
	
	ПараметрыВызоваСервера = Новый Структура();
	ПараметрыВызоваСервера.Вставить("ШаблонСДанными", ШаблонСДанными);
	ПараметрыВызоваСервера.Вставить("ТаблицаСопоставления", РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"));
	ПараметрыВызоваСервера.Вставить("ИнформацияПоКолонкам", РеквизитФормыВЗначение("ИнформацияПоКолонкам"));
	
	ПараметрыВыполненияВФоне = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполненияВФоне.НаименованиеФоновогоЗадания = НСтр("ru = 'Заполнение таблицы сопоставления загруженными данными из файла.'");
	
	ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаДанныхИзФайла.ЗаполнитьТаблицуСопоставленияДаннымиИзШаблонаФон", 
		ПараметрыВызоваСервера, ПараметрыВыполненияВФоне);
	
	
	Возврат ФоновоеЗадание;
КонецФункции

&НаКлиенте
Процедура ПослеСопоставленияЗагружаемыхДанных(ФоновоеЗадание, ДополнительныеПараметры) Экспорт

	Если ФоновоеЗадание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ФоновоеЗадание.Статус = "Выполнено" Тогда
		ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеСопоставленияНаСервере(ФоновоеЗадание.АдресРезультата);
		ВыполнитьШагСопоставлениеЗагружаемыхДанныхКлиент();
	ИначеЕсли ФоновоеЗадание.Статус = "Ошибка" Тогда
		ВывестиСообщениеОбОшибке(НСтр("ru = 'Не удалось произвести сопоставление данных.'"),
			ФоновоеЗадание.КраткоеПредставлениеОшибки);
	КонецЕсли;

КонецПроцедуры

// Фоновая запись загружаемых данных

&НаСервере
Функция ЗаписатьЗагружаемыеДанныеОтчетУниверсальнаяЗагрузка()
	
	ПараметрыЗагрузки = Новый Структура();
	ПараметрыЗагрузки.Вставить("СоздаватьЕслиНеСопоставлено", СоздаватьЕслиНеСопоставлено);
	ПараметрыЗагрузки.Вставить("ОбновлятьСуществующие", ОбновлятьСуществующие);

	ПараметрыВызоваСервера = Новый Структура();
	ПараметрыВызоваСервера.Вставить("СопоставленныеДанные", РеквизитФормыВЗначение("ТаблицаСопоставленияДанных"));
	ПараметрыВызоваСервера.Вставить("ПараметрыЗагрузки", ПараметрыЗагрузки);
	ПараметрыВызоваСервера.Вставить("ИмяОбъектаСопоставления", ИмяОбъектаСопоставления);
	ПараметрыВызоваСервера.Вставить("ИнформацияПоКолонкам", РеквизитФормыВЗначение("ИнформацияПоКолонкам"));
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Запись загруженных данных из файла'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаДанныхИзФайла.ЗаписатьСопоставленныеДанные", 
		ПараметрыВызоваСервера, ПараметрыВыполнения);
	
КонецФункции

&НаКлиенте
Процедура ПослеЗаписиЗагружаемыхДанныхОтчет(ФоновоеЗадание, ДополнительныеПараметры) Экспорт
	
	Если ФоновоеЗадание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ФоновоеЗадание.Статус = "Ошибка" Тогда
		ВывестиСообщениеОбОшибке(НСтр("ru = 'Не удалось произвести запись данных.'"), ФоновоеЗадание.КраткоеПредставлениеОшибки);
	ИначеЕсли ФоновоеЗадание.Статус = "Выполнено" Тогда
		СсылкиНаОбъектыОповещения = Новый Массив;
		ЗаполнитьТаблицуСопоставленияИзВременногоХранилища(ФоновоеЗадание.АдресРезультата, СсылкиНаОбъектыОповещения);
		ОповеститьФормыОбИзменении(СсылкиНаОбъектыОповещения);
		ФоновоеЗаданиеОтчетНаКлиенте();
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуСопоставленияИзВременногоХранилища(АдресВоВременномХранилище, СсылкиНаОбъектыОповещения)
	СопоставленныеДанные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
	ЗначениеВРеквизитФормы(СопоставленныеДанные, "ТаблицаСопоставленияДанных");
	
	ПодготовитьСписокДляОповещения(СопоставленныеДанные, СсылкиНаОбъектыОповещения);
	
КонецПроцедуры

// Фоновое формирование отчета

&НаСервере
Функция СформироватьОтчетОЗагрузке(ТипОтчета = "ВсеЭлементы",  РассчитыватьПроцентПрогресса = Ложь)
	
	СопоставленныеДанные        = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
	ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
	
	ПараметрыВызоваСервера = Новый Структура();
	ПараметрыВызоваСервера.Вставить("ТаблицаОтчет", ТаблицаОтчет);
	ПараметрыВызоваСервера.Вставить("ТипОтчета", ТипОтчета);
	ПараметрыВызоваСервера.Вставить("СопоставленныеДанные", СопоставленныеДанные);
	ПараметрыВызоваСервера.Вставить("ШаблонСДанными", ШаблонСДанными);
	ПараметрыВызоваСервера.Вставить("ИмяОбъектаСопоставления", ИмяОбъектаСопоставления);
	ПараметрыВызоваСервера.Вставить("РассчитыватьПроцентПрогресса", РассчитыватьПроцентПрогресса);
	ПараметрыВызоваСервера.Вставить("ИнформацияПоКолонкам", ТаблицаИнформацияПоКолонкам);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Создание отчета о загрузке данных из файла'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне("Обработки.ЗагрузкаДанныхИзФайла.СформироватьОтчетОЗагрузкеФон",
		ПараметрыВызоваСервера, ПараметрыВыполнения);
		
КонецФункции

&НаКлиенте
Процедура ПослеСозданияОтчета(Задание, ДополнительныеРезультаты) Экспорт

	Если Задание = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Задание.Статус = "Выполнено" Тогда
		ПоказатьОтчет(Задание.АдресРезультата);
		ПодтверждениеЗакрытияФормы = Истина;
	ИначеЕсли Задание.Статус = "Ошибка" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(Задание.КраткоеПредставлениеОшибки);
		ПерейтиКСтранице(Элементы.СопоставлениеЗагружаемыхДанных);
	Иначе
		ПерейтиКСтранице(Элементы.СопоставлениеЗагружаемыхДанных);
	КонецЕсли;
	
КонецПроцедуры

// вывод прогресса

&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат.Статус = "Выполняется" Тогда
		Прогресс = ПрочитатьПрогресс(Результат.ИдентификаторЗадания);
		Если Прогресс <> Неопределено Тогда
			ФоновоеЗаданиеПроцент = Прогресс.Процент;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПрочитатьПрогресс(ИдентификаторЗадания)
	Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
КонецФункции

#КонецОбласти

#КонецОбласти
